暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 15.8.3.3 使缓冲池扫描抗性

原创 由迪 2021-06-17
462

不是使用严格的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),或在与运行时改变了 SET GLOBAL说法。在运行时更改值需要足够的权限来设置全局系统变量。请参阅第 5.1.9.1 节,“系统变量权限”

为了帮助您衡量设置这些参数的效果,该 SHOW ENGINE INNODB STATUS命令报告缓冲池统计信息。有关详细信息,请参阅 使用 InnoDB 标准监视器监视缓冲池

由于这些参数的影响可能因硬件配置、数据和工作负载的详细信息而有很大差异,因此在任何性能关键或生产环境中更改这些设置之前,始终进行基准测试以验证有效性。

在大多数活动是 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不足时进行自己的基准测试 。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论