本节介绍如何配置非持久优化器统计信息。优化器统计信息不会持久化到磁盘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
而如果你有更小的桌子。