10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

15.8.3.3设置缓冲池防扫描

而不是用严厉LRU算法,InnoDB使用一种技术使输入的数据量最小化缓冲池从此再也没有进入过。目标是确保频繁访问的()页仍然保留在缓冲池中,即使预读而且全表扫描引入可能访问也可能不访问的新块。

新读取的块被插入到LRU列表的中间。所有新读取的页面都插入到默认的位置3/8从LRU列表的尾部。当第一次在缓冲池中访问这些页面时,它们被移动到列表的前面(最近使用的一端)。因此,从未访问过的页面永远不会到达LRU列表的前面部分,并且年龄了比严格的LRU方法更快。这种安排将LRU列表划分为两个段,其中考虑插入点下游的页面是LRU驱逐的理想受害者。

请解释一下内部的工作原理InnoDB缓冲池和LRU算法的详细信息,请参见第15.5.1节“缓冲池”

可以控制LRU列表中的插入点,并选择是否插入InnoDB对表或索引扫描带入缓冲池的块应用相同的优化。配置参数innodb_old_blocks_pct控制百分比。LRU列表中的块。的默认值。innodb_old_blocks_pct37,对应原来的固定比例为3/8。取值范围为5(缓冲池中的新页很快就会老化)95(只有5%的缓冲池被预留给热页面,使得算法接近我们熟悉的LRU策略)。

防止缓冲池被预读搅动的优化可以避免由于表或索引扫描而产生的类似问题。在这些扫描中,一个数据页面通常被快速连续访问几次,并且再也不会被碰。配置参数innodb_old_blocks_time指定第一次访问页面后的时间窗口(以毫秒为单位),在此期间,可以在不移动到LRU列表的前面(最近使用的一端)的情况下访问页面。的默认值。innodb_old_blocks_time1000.增加这个值会使越来越多的块更快地从缓冲池中老化。

这两个innodb_old_blocks_pct而且innodb_old_blocks_time可以在MySQL选项文件(my.cnfmy.ini)或在运行时使用集全球声明。在运行时更改值需要足够的特权来设置全局系统变量。看到第5.1.9.1节“系统变量特权”

为了帮助您评估设置这些参数的效果,可以使用显示引擎innodb状态命令用来报告缓冲池的统计信息。有关详细信息,请参见使用InnoDB Standard Monitor监控缓冲池

由于这些参数的效果会根据硬件配置、数据和工作负载的详细信息而发生很大的变化,所以在更改任何性能关键型或生产环境中的这些设置之前,总是要进行基准测试以验证其有效性。

在混合工作负载中,其中大多数活动是OLTP类型的,具有周期性的批量报告查询,这会导致大量扫描,设置的值innodb_old_blocks_time在批处理运行期间,可以帮助保持缓冲池中正常工作负载的工作集。

当扫描无法完全装入缓冲池的大型表时,设置innodb_old_blocks_pct设置为很小的值可以防止只读取一次的数据占用缓冲池的很大一部分空间。例如,设置innodb_old_blocks_pct = 5将只读取一次的数据限制在缓冲池的5%。

当扫描适合内存的小表时,在缓冲池中移动页面的开销更小,因此可以离开innodb_old_blocks_pct在其默认值,或更高的值,例如innodb_old_blocks_pct = 50

的影响innodb_old_blocks_time参数比参数更难预测innodb_old_blocks_pct参数的值相对较小,并且随工作负载的变化更多。为了达到一个最优值,如果性能通过调整得到改善,那么可以执行自己的基准测试innodb_old_blocks_pct是不够的。