一、简述传统的LRU链表

LRU:Least Recently Used

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

如果你读了上一篇:你有没有搞混查询缓存和BufferPool?谈谈看!

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

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

浅析MySQL的lru链表

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

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

二、传统LRU链表的不足

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

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

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

  1. 当Buffer Pool中存储着一个区中13个连续的数据页时,你再去这个区里面读取,MySQL就会将这个区里面所有的数据页都加载进Buffer Pool中的LRU链表中。(然后可能你根本不会使用这些被预读的数据页)
  2. 当你顺序的访问了一个区中大于 innndb_read_ahead_threshold=56个数据页时,MySQL会自动帮你将下一个相邻区中的数据页读入LRU链表中。(这个机制默认是被关闭的)
  3. 当你执行select * from xxx;时,如果表中的数据页非常多,那这些数据页就会一一将Buffer Pool中的经常使用的缓存页挤下去,可能留在LRU链表中的全部是你不经常使用的数据。

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

三、MySQL的LRU链表

接下来我们看下MySQL的Buffer Pool是如何定制LRU链表的,已经LRU帮InnoDB解决了什么问题。

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

MySQL的LRU链表长下面这样。

浅析MySQL的lru链表

LRU链表被MidPoint分成了New Sublist和Old Sublist两部分。

其中New Sublist大概占比5/8,Old Sublist占比3/8。

New Sublist存储着young page,而Old Sublist存储着Old Page。

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

浅析MySQL的lru链表

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

这其实是一种冷热数据分离设计思想。他相对于传统的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链表的资料请关注其它相关文章!

标签:
MySQL,链表,MySQL,lru链表

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无争山庄资源网 Copyright www.whwtcm.com

评论“浅析MySQL的lru链表”

暂无“浅析MySQL的lru链表”评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。