• 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列表。

      

    ----

    学习交流

  • 相关阅读:
    oracle timestamp的转换
    sql总结
    shell命令记录一些
    练手之 合并排序
    jquery的笔记
    jquery的几个小例子
    【转】JQUERY相关的几个网站
    hibernate spring sturts2配置
    oracle积累继续
    2018.8.21 2018暑假集训之方格取数
  • 原文地址:https://www.cnblogs.com/JiangLe/p/7392421.html
Copyright © 2020-2023  润新知