图解MySQL(5)-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链表,就能记录下来哪些缓存页是脏页了。
- 点赞
- 收藏
- 关注作者
评论(0)