1、前言
innerdb 为啥要有个 buffer pool 呢?因为 mysql 的数据页是存储在磁盘上的,如果每次查询都从磁盘上查询数据,想必速度慢的一比,所以有一个 buffer pool 缓存存储查询的数据页。
buffer pool 主要由控制块和数据页组成,控制块记录了数据页的地址、页号等一些元数据信息,控制块由链表相互链接,而控制块指向相应的页面。
2、free 链表
所有空闲的缓存页对应的控制块放到一个链表中,这个链表叫 free 链表。所以每次从磁盘加载一个页到内存中时,会从 free 链表中选取一块空闲的控制块对应的页面,然后把数据页放入其中,再将控制块从 free 链表中移除。
3、flush 链表
如果 buffer pool 中的数据页被修改,那么它与磁盘中的数据就会不同,此时内存中的数据页成为”脏页“。“脏页”肯定不会立即刷到磁盘,而是需要一定的策略来刷,所以需要 flush 链表来管理这些“脏页”。flush 链表上链接着 buffer pool 中所有的“脏页”,等到一定的时机再刷盘。
4、lru 链表
那么磁盘中已经使用的数据页由谁记录呢?所以 lru 链表呼之欲出了。当然传统的 lru 面临着修改过于频繁的问题,所以 innerdb 将 lru 进行了优化,将 lru 分为了热数据区、冷数据区。冷数据区的第二次访问时间 - 第一次访问时间 > 1s 才会被移动到热数据区。
5、总体结构
如果说白色是未使用,黄色 + 深色是已经使用,深色表示已经修改
它们总体结构如下图所示:
buffer pool 中的链表
首先,我不是很知道 buffer pool 的数据结构是什么,所以以上说的都是逻辑概念,按照逻辑概念理解即可。
网友评论