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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值