图解MySQL(5)-Buffer Pool的flush链表
【摘要】 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)