本节介绍如何配置非持久优化器统计信息。当 innodb_stats_persistent=OFF
或当使用 STATS_PERSISTENT=0
创建或更改单个表时,优化器统计信息不会持久保存到磁盘。相反,统计信息存储在内存中,并在服务器关闭时丢失。统计信息还会在某些操作期间和特定条件下定期更新。
优化器统计信息默认情况下会持久保存到磁盘,由 innodb_stats_persistent
配置选项启用。有关持久优化器统计信息的详细信息,请参见 第 17.8.10.1 节,“配置持久优化器统计参数”。
优化器统计信息更新
当执行以下操作时,非持久优化器统计信息将被更新
运行
ANALYZE TABLE
。运行
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
注意innodb_stats_on_metadata
仅在优化器 统计信息 配置为非持久性时(当innodb_stats_persistent
被禁用时)才适用。使用启用
--auto-rehash
选项(默认选项)启动 mysql 客户端。auto-rehash
选项会导致所有InnoDB
表被打开,而打开表操作会导致统计信息被重新计算。要提高 mysql 客户端的启动时间和统计信息更新,可以使用
--disable-auto-rehash
选项关闭auto-rehash
。auto-rehash
功能允许交互式用户自动完成数据库、表和列名称。首先打开一个表。
InnoDB
检测到自上次更新统计信息以来,表已被修改了 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
值。