MySQL: 12 当更新Buffer Pool中的数据时,flush链表的作用
Posted 鮀城小帅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL: 12 当更新Buffer Pool中的数据时,flush链表的作用相关的知识,希望对你有一定的参考价值。
1. Buffer Pool中的内存碎片问题
在Buffer Pool中是存在内存碎片的。
由于Buffer Pool大小是固定的,当Buffer Pool划分完全部的缓存页和描述数据块之后,还剩一点点的内存,而这一点点内存又放不下任何一个缓存页,就只能放着不能用,这就是内存碎片。
数据块在Buffer Pool中划分缓存页的时候,会让所有的缓存页和描述数据块都紧密的挨在一起,从而尽可能的减少内存浪费,来减少内存碎片的产生。
2. 脏数据页
在执行增删改的时候,如果发现数据页没缓存,就会基于free链表找到一个空闲的缓存页,然后读取数据页到缓存页里去;如果已经缓存了,那么下一次就会直接使用缓存页。
总而言之,你所要更新的数据页都会在Buffer Pool的缓存页里,以便让你在内存中直接执行增删改的操作。
脏数据页的产生
当你去更新Buffer Pool的缓存页中的数据,此时一旦你更新了缓存页中的数据。那么缓存页里的数据和磁盘上的数据页里的数据,就不一致了。
此时,我们就说缓存页是脏数据,脏页。
3.哪些缓存页是脏页
只有在内存里更新的脏页的数据,是要被刷新回磁盘文件的。而不是所有的缓存页都刷回磁盘,用于查询的时候被读取到Buffer Pool里去的缓存页是没有修改过的,不需要刷回磁盘。
数据库里引入了flush链表,这个flush链表本质也是通过缓存页的描述数据块中的两个指针,让被修改过的缓存页的描述数据块,组成一个双向链表。
范式被修改过的缓存页,都会把它的描述数据块加入到flush链表中去,flush的意思是这些都是脏页,后续都是要flush刷新到磁盘上去的。
4.flush链表构造的伪代码演示
在flush链表的构造过程中,比如现在缓存页01被修改了数据,那么它就是脏页了,此时就必须将它加入到flush链表中去。
缓存页01的描述数据块如下:
现在flush链表的基础节点指向了一个block01的节点,接着缓存页02也被更新了,它也是脏页,此时他的描述数据块也要被加入到flush链表中去。
伪代码如下:
可以看到,当更新缓存页的时候,通过变换缓存页中的描述数据块的flush链表的指针,就可以把脏页的描述数据块组成一个双向链表,也就是flush链表,而且flush链表的基础节点会指向起始节点和尾节点。
通过这个flush链表,就可以记录下来哪些缓存页是脏页了。
以上是关于MySQL: 12 当更新Buffer Pool中的数据时,flush链表的作用的主要内容,如果未能解决你的问题,请参考以下文章
Mysql专栏-Buffer Pool缓存机制的一整套运行原理
Mysql专栏-Buffer Pool缓存机制的一整套运行原理