mysql-5.7中innodb_buffer_pool页面淘汰算法

一、 什么是innodb_buffer_pool:

  innodb_buffer_pool是一块内存区域,innodb用它来缓存数据,索引,undo,change buffer ... ;

  这块区域又被分成若干份,每一份叫一个innodb_buffer_pool_instance。对于每一个instance来说

  从数据结构上来看它就是一列表。innodb通过LRU算法对这个列表中的页进行管理

 

二、innodb 使用的是调整后的LRU算法:

  1、innodb逻辑上把列表分成两段,前面的5/8叫做new列表,后面的3/8叫做old列表;

  2、一个在磁盘上的数据页有两种可能会被调入innodb_buffer_pool,第一种是用户发起的SQL语句

  用它了这个页面中的数据,第二种是innodb根据自己的预读算法把用户接下来非常有可能访问到的页

  调入innodb_buffer_pool;

  3、页面调入时都是先被插入到old列表中,如果old这个时候是满的,那么old列表就要淘汰掉相同数据的页面,

  以容纳下新调入进入来的页面,那页面什么时候会进入new列表呢?由于第一种情况下调入的页面会马上被访问(access),

  这个时候页面会被标记成'young',这样的页面就会进入new列表的顶部了;至于第二种情况下调入的页面能不能进入new列表

  也是一样的,就看它在old列表中的时候有没有被访问,如果它一直没能被访问,那也就只能是被淘汰出old列表了。

 

三、这种调整后的LRU算法依然不完美:

  这种调整后的LRU还是有可能出问题的,比如对一个大表进行全表扫描的话,就上面的算法而言,表中的所有页面都要进入new

  列表;那么之前的热数据就都被这个全表扫描给挤出来了;

 

四、解决这种不完美:

  innodb_old_blocks_time这个参数就是针对上面的不完美设计的,它是怎么做到的呢?页面不再是一被访问就能进入new列表

  而是要在old列表中呆innodb_old_blocks_time这么长的时间后,又被访问了后才能进入new列表。

  

----

学习交流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值