码迷,mamicode.com
首页 > 数据库 > 详细

mysql-5.7中innodb_buffer_pool页面淘汰算法

时间:2017-08-18 23:42:36      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:算法   调整   问题   new   相同   索引   lru算法   页面   解决   

一、 什么是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列表。

  

  

 

 

 

----

mysql-5.7中innodb_buffer_pool页面淘汰算法

标签:算法   调整   问题   new   相同   索引   lru算法   页面   解决   

原文地址:http://www.cnblogs.com/JiangLe/p/7392421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!