MySQL: 18 优化后的LRU链表中尾部的缓存页淘汰刷入磁盘的机制

Posted 鮀城小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL: 18 优化后的LRU链表中尾部的缓存页淘汰刷入磁盘的机制相关的知识,希望对你有一定的参考价值。

1. Buffer Pool 的缓存页与几个链表的使用

Buffer Pool在运行中被使用的时候,实际上会频繁的从磁盘上加载数据页到它的缓存页里去,然后free链表、flush链表、lru链表都会在使用的时候同时被使用。

对于将数据加载到一个缓存页,free链表里会移除这个缓存页,然后lru链表的冷数据区域的头部会放入这个缓存页。

如果修改了一个缓存页,那么flush链表中会记录这个脏页,lru链表中还可能会把你从冷数据区域移动到热数据区域的头部去。

如果是查询了一个缓存页,就会把这个缓存页在lru链表中移动到热数据区域去,或者在热数据区域中也有可能会移动到头部去。

2. 定时把LRU尾部的部分缓存页刷入磁盘

首先并不是在缓存页满的时候,才会挑选LRU冷数据区域尾部的几个缓存页刷入磁盘,而是有一个后台线程,它会运行一个定时额任务,这个定时任务每隔一段时间就会把LRU链表的冷数据区域的尾部的一些缓存页,刷入磁盘里去,清空这几个缓存页,把他们加入到free链表里去。

所以实际上在缓存页没用完的时候,可能就会清空一些缓存了。

 所以,只要有这个后台线程定时运行,可能你的缓存页都没用完,人家就给你把一批冷数据的缓存页刷入磁盘,清空出来一批缓存页,那么你就多了一批可以使用的空闲缓存页了。

3. 把flush链表中的一些缓存定时刷入磁盘

在LRU链表的热数据区域里的很多缓存页可能也会被频繁的修改,他们也需要在一定时间后被刷入磁盘中的。

所以前一节中说到的后台线程同时也会在mysql不怎么繁忙的时候,找个时间把flush链表中的缓存页都刷入磁盘中,这样被修改过的数据,迟早都会刷入磁盘的。

只要flush链表中的一些缓存页被刷入了磁盘,那么这些缓存页也会从flush链表和lru链表中移除,然后加入到 free链表中去。

总得来说,当你一边不停的加载数据到缓存页里去,不停的查询和修改缓存数据,然后free链表中的缓存页不停的在减少,flush链表中的缓存页不停的在增加,lru链表中的缓存页不停的在增加和移动。

另外一边,后台线程不停在把lru链表的冷数据区域的缓存页以及flush链表的缓存页,刷入磁盘中来清空缓存页,然后flush链表和lru链表中的缓存页在减少,free链表中的空闲缓存页在增加。

这就是一个动态运行起来的效果。

4.实在没有空闲缓存页了怎么办?

如果是实在没有空闲缓存页了的情况下。

此时可能所有的free链表都被使用了,然后flush链表中有一大堆被修改过的缓存页,lru链表中有一大堆的缓存页,根据冷热数据进行了分离。

如果这时候要从磁盘加载数据页到一个空闲缓存页中,此时就会从LRU链表的冷数据区域的尾部找到一个缓存页,它一定是最不经常使用的缓存页。然后把它刷入磁盘和清空,然后把数据页加载到这个腾出来的空闲缓存页里去。

这就是MySQL的Buffer Pool缓存机制的一整套运行原理。

以上是关于MySQL: 18 优化后的LRU链表中尾部的缓存页淘汰刷入磁盘的机制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL: 14 LRU链表在Buffer Pool实际运行中可能导致的问题

单链表LRU

LRU 缓存淘汰算法

MySQL: 17 MySQL是如何将LRU链表的使用性能优化到极致的?

mysql的缓存页对LRU的改进;预读机制;及对应的调优

mysql的缓存页对LRU的改进;预读机制;及对应的调优