mysql冷热数据LRU_浅析MySQL的lru链表

本文介绍了MySQL的LRU链表机制,包括其在处理冷热数据时的优化策略。MySQL的LRU链表分为new sublist和old sublist两部分,通过midpoint参数实现冷热数据分离,防止全表扫描导致频繁使用的数据页被刷出。此外,还讨论了innodb_old_blocks_time参数如何影响数据页的热状态判断,以及new sublist前1/4数据的特殊处理。
摘要由CSDN通过智能技术生成

一、简述传统的lru链表

lru:least recently used

相信大家对lru链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是lru链表,甚至是让你手写一个lru链表。

想必你已经知道了mysql的buffer pool机制以及mysql组织数据的最小单位是数据页。并且你也知道了 数据页在buffer pool中是以lru链表的数据结构组织在一起的。

其实所谓的lru链表本质上就是一个双向循环链表,如下图:

54797a66d22d9023a2f60ba641962f82.png

下面我们结合lru链表和数据页机制描述一下mysql加载数据的机制:

我们将从磁盘中读取的数据页称为young page,young page会被直接放在链表的头部。已经存在于lru链表中数据页如果被使用到了,那么该数据页也被认为是young page而被移动到链表头部。这样链表尾部的数据就是最近最少使用的数据了,当buffer pool容量不足,或者后台线程主动刷新数据页时,就会优先刷新链表尾部的数据页。

二、传统lru链表的不足

相信你之前肯定听说过操作系统级别的空间局部性原理:

spatial locality(空间局部性):也就是说读取一个数据,在它周围内存地址存储的数据也很有可能被读取到,于是操作系统会帮你预读一部分数据。

mysql也是存在存在预读机制的!

当buffer pool中存储着一个区中13个连续的数据页时,你再去这个区里面读取,mysql就会将这个区里面所有的数据页都加载进buffer pool中的lru链表中。(然后可能你根本不会使用这些被预读的数据页)

当你顺序的访问了一个区中大于 innndb_read_ahead_threshold=56个数据页时,mysql会自动帮你将下一个相邻区中的数据页读入lru链表中。(这个机制默认是被关闭的)

当你执行select * from xxx;时,如果表中的数据页非常多,那这些数据页就会一一将buffer pool中的经常使用的缓存页挤下去,可能留在lru链表中的全部是你不经常使用的数据。

综上你可以看到,所谓的预读机制的优势,实际上违背了lru去实现将最近最少使用的数据页刷入磁盘的设计初衷。

三、mysql的lru链表

接下来我们看下mysql的buffer pool是如何定制lru链表的,已经lru帮innodb解决了什么问题。

当业务进行大量的crud时,需要不断的将数据页读取到buffer pool中的lru链表中。

mysql的lru链表长下面这样。

ff0500e0bdd6f2506099915a3ac058f8.png

lru链表被midpoint分成了new sublist和old sublist两部分。

其中new sublist大概占比5/8,old sublist占比3/8。

new sublist存储着young page,而old sublist存储着old page。

我们可以通过如下的方式查看midpoint的默认值。

4136b7e8799db75ecddf96bf4ebd6a11.png

用户可以根据自己的业务动态的调整这个参数!

这其实是一种冷热数据分离设计思想。他相对于传统的lru链表有很大的优势

四、mysql定制lru链表的优势

而对于mysqllru链表来说,通过midpoint将链表分成两部分。

从磁盘中新读出的数据会放在old sublist的头部。这样即使你真的使用select * from t;也不会导致new sublist中的经常被访问的数据页被刷入磁盘中。

正常情况下,访问old sublist中的缓存页,那么该缓存页会被提升到new sublist中成为热数据。

但是当你通过 select * from t 将一大批数据加载到old sublist时,然后在不到1s内你又访问了它,那在这段时间内被访问的缓存页并不会被提升为热数据。 这个1s由参数innodb_old_blocks_time控制。

另外:new sublist也是经过优化的,如果你访问的是new sublist的前1/4的数据,他是不会被移动到lru链表头部去的。

以上就是浅析mysql的lru链表的详细内容,更多关于mysql lru链表的资料请关注萬仟网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值