图解MySQL(5)-Buffer Pool的flush链表

网友投稿 665 2022-05-28

1 内存碎片

1.1 啥是BP的内存碎片?

BP划分完全部缓存页和描述信息块后,还剩点内存,但却再也放不下新的缓存页。

1.2 如何减少内存碎片?

DB在BP中划分缓存页时,会让所有缓存页和描述信息块都紧密挨一起,尽可能减少内存碎片。

图解MySQL(5)-Buffer Pool的flush链表

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链表,就能记录下来哪些缓存页是脏页了。

Mysql 数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为云大咖说—大数据应用开发指导
下一篇:微认证之通过鲲鹏ECS搭建免费个人书库
相关文章