本节描述如何配置非持久优化器统计信息。优化器统计信息不会在innodb_stats_persistent=OFF
或在单个表创建或修改时使用STATS_PERSISTENT=0
时持久化到磁盘上。相反,统计信息将存储在内存中,并在服务器关闭时丢失。统计信息也会在某些操作和特定条件下定期更新。
优化器统计信息默认情况下会持久化到磁盘上,通过innodb_stats_persistent
配置选项启用。有关持久优化器统计信息的信息,请参阅第17.8.10.1节,“配置持久优化器统计参数”。
优化器统计更新
非持久优化器统计信息将在以下情况下更新:
-
运行
SHOW TABLE STATUS
、SHOW INDEX
或查询信息模式TABLES
或STATISTICS
表时,启用innodb_stats_on_metadata
选项。默认情况下,
innodb_stats_on_metadata
的设置为OFF
。启用innodb_stats_on_metadata
可能会减慢大型表或索引的访问速度,并减少涉及InnoDB表的查询执行计划的稳定性。innodb_stats_on_metadata
可以使用SET
语句全局配置。SET GLOBAL innodb_stats_on_metadata=ON
Noteinnodb_stats_on_metadata
仅在优化器统计信息配置为非持久时生效(当innodb_stats_persistent
禁用时)。 -
启动mysql客户端时,使用
--auto-rehash
选项启用,默认情况下启用该选项。auto-rehash
选项会打开所有InnoDB表,并且打开表操作会导致统计信息重新计算。要提高mysql客户端的启动时间和统计信息更新,可以使用
--disable-auto-rehash
选项关闭auto-rehash
功能。auto-rehash
功能启用自动名称完成数据库、表和列名的交互式用户。 -
表首次打开。
-
检测到表的1/16部分自上次更新统计信息以来已经修改。
配置采样页面数
MySQL 查询优化器使用估算的 统计信息 关于键分布来选择执行计划中的索引,基于索引的相对 选择性。当 InnoDB
更新优化器统计信息时,它从每个表的索引中随机抽样页面来估算索引的 基数。(这种技术称为 随机潜水。)
为了让您控制统计信息的质量(从而为查询优化器提供更好的信息),您可以使用参数 innodb_stats_transient_sample_pages
更改采样页面的数量。默认情况下,采样页面的数量为 8,这可能不足以产生准确的估算,导致查询优化器做出不良的索引选择。这项技术对于大型表和参与 连接 的表格尤其重要。这些表格的不必要的 全表扫描 可能会导致性能问题。请参阅 第 10.2.1.23 节,“避免全表扫描” 以获取调整这些查询的提示。innodb_stats_transient_sample_pages
是一个全局参数,可以在运行时设置。
参数 innodb_stats_transient_sample_pages
的值会影响所有 InnoDB
表和索引的索引采样,当 innodb_stats_persistent=0
时。请注意以下可能的重要影响,当您更改索引采样大小时:
-
小值,如 1 或 2,可能会导致基数的不准确估算。
-
增加
innodb_stats_transient_sample_pages
的值可能需要更多的磁盘读取。值远大于 8(例如 100),可能会导致打开表或执行SHOW TABLE STATUS
的时间明显增加。 -
优化器可能会根据不同的索引选择性估算选择非常不同的查询计划。
无论什么值的 innodb_stats_transient_sample_pages
对系统最好,设置该选项并将其保持在该值。选择一个值,使得所有表的估算都足够准确,而不需要过多的 I/O。因为统计信息会在执行 ANALYZE TABLE
语句以外的其他时间自动重新计算,因此没有必要增加索引采样大小,执行 ANALYZE TABLE
,然后再次减少采样大小。
小表格通常需要比大表格少的索引采样。如果您的数据库有许多大表格,考虑使用比小表格更高的 innodb_stats_transient_sample_pages
值。