阿里面试题:什么是BufferPool?

611 阅读3分钟

欢迎关注公众号:月伴飞鱼,每天分享程序员职场经验!

文章内容收录到个人网站,方便阅读:hardyfish.top/

资料分享

MySQL排错指南:

MySQL性能调优与架构设计:

基本概念

Buffer Pool 是一片连续的内存空间,通过innodb_buffer_pool_size在服务器运行过程中调整buffer pool大小,默认为128MB。

Free Page(空闲页),此页未被使用,位于 Free 链表

Clean Page(干净页),此页已被使用,但是页面未发生修改,位于 LRU 链表

Dirty Page(脏页),表示此页已被使用已经被修改,其数据和磁盘上的数据已经不一致。

脏页上的数据写入磁盘后,内存数据和磁盘数据一致,那么该页就变成了干净页,脏页同时存在于LRU链表和Flush链表。

提高读性能:

读取数据的时候,先从buffer pool LRU链表(干净页)读取数据。

如果没有从磁盘读取并把它相邻的数据页一并加载进来。

提高写性能:

更新数据的时候,不需要每次都要写入磁盘,而是将 Buffer Pool 对应的缓存页标记为脏页,然后再由后台线程将脏页写入到磁盘。

数据页

磁盘文件被分成很多数据页,一个数据页里面有很多行数据。

一个数据页默认大小 16K。

更新一行数据,实际上是把行数据所在的 数据页 整个加载到buffer pool中。

在这里插入图片描述

缓存页

buffer pool中存放的数据页我们叫缓存页,和磁盘上的数据页是一一对应的,都是16KB。

缓存页的数据,是从磁盘上加载到buffer pool当中的。

缓存页描述信息(描述信息块)

存的是 数据页所属的表空间号,数据页编号,数据页地址等信息。

放在缓存页的前面。

每个描述信息块大小是缓存页的5%左右,大约是 16*1024*0.05=800个字节。

基本结构

在这里插入图片描述

buffer pool初始化

数据库只要一启动,就会按照你设置的Buffer Pool大小。

稍微再加大一点,去找操作系统申请一块内存区域,作为Buffer Pool的内存区域。

然后当内存区域申请完毕之后,数据库就会按照默认的缓存页的16KB的大小以及对应的800个字节左右的描述数据的大小。

在Buffer Pool中划分出来一个一个的缓存页和一个一个的他们对应的描述数据。

在这里插入图片描述

管理空闲页

当需要从磁盘中加载一个页到 Buffer Pool 中时。

通过Free链表取一个空闲的缓存页,并且填写该缓存页对应的控制块的信息,然后把该缓存页对应的控制块从Free 链表中移除。

在这里插入图片描述

管理脏页

在需要刷盘时,使用Flush链表,后台线程就可以遍历脏页,写入到磁盘。

在这里插入图片描述