文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  配置非持久性优化器统计参数

17.8.10.2 配置非持久性优化器统计参数

本节介绍如何配置非持久性优化器统计信息。当 innodb_stats_persistent=OFF 或使用 STATS_PERSISTENT=0 创建或更改单个表时,优化器统计信息不会持久保存到磁盘。相反,统计信息存储在内存中,并在服务器关闭时丢失。统计信息还会定期在某些操作下和某些条件下更新。

默认情况下,优化器统计信息会持久保存到磁盘,由 innodb_stats_persistent 配置选项启用。有关持久性优化器统计信息的更多信息,请参见 第 17.8.10.1 节,“配置持久性优化器统计参数”.

优化器统计信息更新

非持久性优化器统计信息会在以下情况更新

配置采样页面数量

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 值。