14.6.3.3 Making the Buffer Pool Scan Resistant
相比使用一个严格的LRU算法,InnoDB 使用一个技术来最小化数据总量 带入到buffer pool 而不被再次访问。
目标是确保频繁访问的热的Pages停留在buffer pool里,
即使预读和全表扫描带入到新的blocks 以后不会再被访问
新读取的blocks 是插入到LRU列表的中间, 所有新读取的Pages是插入在默认是3/8的位置lru 列表的尾部。
pages会被移动到列表的前面(最常使用的尾部) 当它们被访问在buffer pool 对于首次访问。
这样, pages 不会再访问 不会让他到LRU列表的全面部分,
很快淘汰在一个严格的LRU 方法。
这种安排把LRU列表分成2个部分, 插入点的下面被认为是老的 会被驱逐
对于一个InnoDB buffer pool 内存网络的活动,指定LRU 算法
你可以控制插入点在LRU列表中,选择是否InnoDB 应用相同的优化对于带入到Buffer pool通过表或者索引扫描。
配置参数innodb_old_blocks_pct 控制了old blocks的比例在LRU列表里。
默认值是37, 相应的比例是3/8.
优化 保持Buffer pool 避免被搅动通预读可以避免类似问题由于表或者索引扫描。
在这些扫描中,一个数据页通常被访问很少的时间 不会再次被访问。
配置参数innodb_old_blocks_time 指定了时间单位毫秒 在第一次访问后一个page 可以被访问不需要移动到前端(最常使用列表的尾端)
增加这个值 让更多的blocks 看起来更快的age out
innodb_old_blocks_pct and innodb_old_blocks_time 都是动态的
因此那些参数的影响可以基于你的硬件配置,你的数据和你的负载的细节
当扫描大的表不能整个放进Buffer pool,设置 innodb_old_blocks_pct 为一个小的值
让数据只读一次的消耗很大一部分buffer pool.
比如,你设置 innodb_old_blocks_pct=5 限制了这个数据只读一次到buffer pool的5%