zoukankan      html  css  js  c++  java
  • 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列表。

      

    ----

    学习交流

  • 相关阅读:
    C语言之数组中你所不在意的重要知识
    Word2007怎样从随意页開始设置页码 word07页码设置毕业论文
    天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能
    高速排序算法
    Cocos2d-x中停止播放背景音乐
    Netflix公司监控内部安全的开源项目
    Linux内核——进程管理与调度
    WebService之Soap头验证入门
    Google搜索解析
    android-sdk-windows版本号下载
  • 原文地址:https://www.cnblogs.com/JiangLe/p/7392421.html
Copyright © 2011-2022 走看看