本节介绍如何配置非持久性优化器统计信息。当 innodb_stats_persistent=OFF
或使用 STATS_PERSISTENT=0
创建或更改单个表时,优化器统计信息不会持久保存到磁盘。相反,统计信息存储在内存中,并在服务器关闭时丢失。统计信息还会定期在某些操作下和某些条件下更新。
默认情况下,优化器统计信息会持久保存到磁盘,由 innodb_stats_persistent
配置选项启用。有关持久性优化器统计信息的更多信息,请参见 第 17.8.10.1 节,“配置持久性优化器统计参数”.
优化器统计信息更新
非持久性优化器统计信息会在以下情况更新
运行
ANALYZE TABLE
.运行
SHOW TABLE STATUS
、SHOW INDEX
或使用启用了innodb_stats_on_metadata
选项查询信息模式TABLES
或STATISTICS
表。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_persistent=0
时,innodb_stats_transient_sample_pages
的值会影响所有 InnoDB
表和索引的索引采样。请注意,更改索引样本大小可能会导致以下潜在重大影响:
像 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
值。