mysql的预读机制带来的问题以及优化后的lru链表对该问题的解决

mysql预读机制可能会扰乱我们之前设想的lru链表的处理逻辑。当⼀个数据⻚被加载到缓冲池中时,可能顺带会把其他⽆关紧要的数据⻚也加载到缓冲池中,这些顺带加载到内存的数据⻚,它们往往被访问的频率是⾮常低的,但是由于lru链表的特点,新加⼊的总是会优先被排在lru的链表头,导致这些顺带进来的、访问频率⽐较低的缓存⻚排在⽐较靠前的位置,导致free链表不够时,lru链表反⽽会把那些本来访问频率较⾼、但是此时被排挤到lru链表尾的缓存⻚给刷盘清
理了,这是很不合理的。

优化后的lru链表主要引⼊了冷热数据分离的思想解决了mysql预读机制带来的问题。把lru链表分为热数据区和冷数据区,热数据区主要存放那些访问频率⾼的缓存⻚,冷数据区存放访问频率较低的缓存⻚;从磁盘加载数据到lru链表时,⾸先会将加载到的缓存⻚直接先放到冷数据链的表头,如果1000ms(默认,可配置)后冷数据的缓存⻚⼜被访问了,此时就认为这些1000ms之后被访问的缓存⻚,在不久的未来可能还会被访问,可以认为它们是热数据了,就会把这些缓存⻚从冷数据区的链表给移动到热数据区链表的表头,通过该步骤可以将热数据从冷数据堆中给巧妙的分离出来,如下图所示:

此时如果要加载其他数据⻚发现缓冲池内存不够,实际上后台⼀直会有⼀个线程开启的⼀个定时任务,不断的从lru链表的尾部将缓存⻚给刷到磁盘中并释放缓存⻚,lru链表冷热数据分离的设计,确保了定时任务从lru链表尾部回收的缓存⻚都是访问频率很低的数据,对性能的影响也就降到了最低。

未经允许不得转载:任鹏个人博客 » mysql的预读机制带来的问题以及优化后的lru链表对该问题的解决

赞 (0) 打赏

评论 2

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. muh1可以合作交换友链吗?回复
    • pren网站发来看看回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏