文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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