本节描述如何配置非持久优化器统计信息。时,优化器统计信息不会持久保存到磁盘innodb_stats_persistent =了
或在创建或更改单个表时使用STATS_PERSISTENT = 0
.相反,统计数据存储在内存中,当服务器关闭时将丢失。根据某些操作和某些条件,统计数据也会定期更新。
的优化器统计信息默认情况下持久化到磁盘innodb_stats_persistent
配置选项。有关持久优化器统计信息,请参见第15.8.10.1节“配置持久优化器统计参数”.
优化器数据更新
非持久优化器统计信息在以下情况下更新:
运行
分析表
.运行
显示表状态
,显示指数
,或查询INFORMATION_SCHEMA。表
或INFORMATION_SCHEMA。统计数据
表的innodb_stats_on_metadata
选择启用。的默认设置
innodb_stats_on_metadata
是从
.启用innodb_stats_on_metadata
可能会降低具有大量表或索引的模式的访问速度,并降低涉及InnoDB
表。innodb_stats_on_metadata
全局配置时使用集
声明。集全球innodb_stats_on_metadata =
请注意innodb_stats_on_metadata
仅适用于优化器时统计数据配置为非持久化的(当innodb_stats_persistent
禁用)。开始一个mysql客户端与
——auto-rehash
选项已启用,这是默认值。的auto-rehash
选项导致所有InnoDB
要打开的表,以及打开表的操作会导致统计信息被重新计算。提高开机时间mysql客户端和要更新的统计信息,可以关闭
auto-rehash
使用——disable-auto-rehash
选择。的auto-rehash
功能支持为交互用户自动完成数据库、表和列名的名称。首先打开一个表。
InnoDB
检测到自上次更新统计信息以来,表的1 / 16已被修改。
配置采样页面数
MySQL查询优化器使用估计统计数据关于为执行计划选择索引的键分布,基于相对选择性的索引。当InnoDB
更新优化器统计信息,它从表上的每个索引中抽样随机页面来估计基数的索引。(这种技术被称为随机的潜水.)
为了控制统计估计的质量(从而为查询优化器提供更好的信息),可以使用该参数更改抽样页面的数量innodb_stats_transient_sample_pages
.采样页面的默认数量是8,这可能不足以产生准确的估计,导致查询优化器的索引选择很差。中使用的大型表和表尤其重要连接.不必要的全表扫描因为这样的表可能会带来很大的性能问题。看到第8.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)的值可能会导致打开表或执行的时间显著放缓显示表状态
.根据对索引选择性的不同估计,优化器可能会选择非常不同的查询计划。
任何价值innodb_stats_transient_sample_pages
最适合于系统,设置选项并保持该值。选择一个对数据库中所有表进行合理准确估计的值,而不需要过多的I/O。因为统计信息会在不同的时间自动重新计算,而不是在执行分析表
时,增加索引样本量没有意义,运行分析表
,然后再次减少样本量。
较小的表通常比较大的表需要更少的索引样本。如果您的数据库有许多大表,请考虑使用更高的值innodb_stats_transient_sample_pages
如果你的表大多较小。