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

举报
JavaEdge 发表于 2022/02/04 20:26:47 2022/02/04
【摘要】 1 内存碎片 1.1 啥是BP的内存碎片?BP划分完全部缓存页和描述信息块后,还剩点内存,但却再也放不下新的缓存页。 1.2 如何减少内存碎片?DB在BP中划分缓存页时,会让所有缓存页和描述信息块都紧密挨一起,尽可能减少内存碎片。 2 脏数据页增删改时,若发现数据页没缓存,就会从free链表找空闲缓存页,读取到BP的缓存页,但若已缓存,则下次直接使用缓存页。所以你要更新的数据页都会在BP缓...

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。