14.6.3.3 Making the Buffer Pool Scan Resistant

时间:2023-07-07 22:55:20
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%