什么是Buffer Pool
为了缓存磁盘中的页,
MySQL
服务器启动的时候就向操作系统申请了一片连续的内存,他们给这片内存起了个名,叫做Buffer Pool
(中文名是缓冲池
)。innodb_buffer_pool_size
参数的值,它表示Buffer Pool
的大小。
Buffer Pool内部组成
Buffer Pool
中默认的缓存页大小和在磁盘上默认的页大小是一样的,都是16KB
。
为了更好的管理这些在Buffer Pool
中的缓存页,每一个缓存页都创建了一些所谓的控制信息
,这些控制信息包括该页所属的表空间编号、页号、缓存页在Buffer Pool
中的地址、链表节点信息、一些锁信息以及LSN
信息,称之为 控制块
,控制块和缓存页是一一对应的,它们都被存放到 Buffer Pool 中。
free链表的管理
- 申请和分配好
Buffer Pool
之后,如何使用和管理呢?从磁盘上读取一个页到Buffer Pool
中的时候该放到哪个缓存页的位置呢?或者说怎么区分Buffer Pool
中哪些缓存页是空闲的,哪些已经被使用了呢?
初始化的时候,我们可以把所有空闲的缓存页对应的控制块作为一个节点放到一个链表中,这个链表也可以被称作
free链表
(或者说空闲链表)如下图所示:
链表的基节点占用的内存空间并不包含在为Buffer Pool
申请的一大片连续内存空间之内,而是单独申请的一块内存空间。
每当需要从磁盘中加载一个页到Buffer Pool
中时,就从free链表
中取一个空闲的缓存页,并且把该缓存页对应的控制块
的信息填上(就是该页所在的表空间、页号之类的信息),然后把该缓存页对应的free链表
节点从链表中移除,表示该缓存页已经被使用了~