图解 MySQL(5)-Buffer Pool 的 flush 链表
Buffer Pool 的 flush 链表
1 内存碎片
1.1 啥是 BP 的内存碎片?
BP 划分完全部缓存页和描述信息块后,还剩点内存,但却再也放不下新的缓存页。
1.2 如何减少内存碎片?
DB 在 BP 中划分缓存页时,会让所有缓存页和描述信息块都紧密挨一起,尽可能减少内存碎片。
2 脏数据页
增删改时,若发现数据页没缓存,就会从 free 链表找空闲缓存页,读取到 BP 的缓存页,但若已缓存,则下次直接使用缓存页。
所以你要更新的数据页都会在 BP 缓存页,让你能在内存中直接执行增删改。所以肯定会更新 BP 缓存页数据,一旦更新了,则缓存页数据和磁盘的数据页数据,就不一致了,这时的 BP 缓存页就是脏数据,即为脏页。
2.1 哪些缓存页是脏页
最终这些在内存里更新的脏页数据,都是要被刷回磁盘文件的。
但不可能所有缓存页都刷盘,因为有的缓存页可能因查询而被读取到 BP,可能根本没修改过!
于是 DB 引入 flush 链表,类似 free 链表,通过缓存页的描述信息块的两个指针,让被修改过的缓存页的描述信息块组成双向链表。
被修改过的缓存页,都会将其描述信息块加入到 flush 链表中去,flush 就是这些都是脏页,后续都是要 flush 刷新到磁盘:
flush 链表构造演示
比如缓存页 01 被修改了数据,那他就是脏页了,就加入 flush 链表。现在 flush 链表的基础节点就指向 block01 节点,接着比如缓存页 02 被更新,他也是脏页,那他的描述信息块也要被加入 flush 链表。
可见,当你更新缓存页时,通过变换缓存页中的描述数据块的 flush 链表的指针,就能将脏页的描述数据块组成一个双向链表,即 flush 链表,而且 flush 链表的基础节点会指向起始节点和尾巴节点。通过次 flush 链表,就能记录下来哪些缓存页是脏页了。
版权声明: 本文为 InfoQ 作者【JavaEdge】的原创文章。
原文链接:【http://xie.infoq.cn/article/c80ad0630f7b223db9226bb44】。文章转载请联系作者。
评论