17.8.10.2 配置非持久优化器统计参数
本节描述了如何配置非持久优化器统计。优化器统计不在innodb_stats_persistent=OFF
或单个表创建或更改时使用STATS_PERSISTENT=0
时被 persisted 到磁盘,而是存储在内存中,并且在服务器关闭时丢失。统计信息也会在某些操作和特定条件下更新。
优化器统计默认情况下被 persisted 到磁盘,通过innodb_stats_persistent
配置选项启用。关于持久优化器统计的信息,请参阅第17.8.10.1节,“Configuring Persistent Optimizer Statistics Parameters”。
优化器统计 Updates
非持久优化器统计在以下情况下更新:
-
使用
SHOW TABLE STATUS
、SHOW INDEX
或查询信息架构TABLES
或STATISTICS
表时,需要启用innodb_stats_on_metadata
选项。默认情况下,
innodb_stats_on_metadata
设置为OFF
。启用innodb_stats_on_metadata
可能会对包含大量表或索引的架构的访问速度产生影响,并且对涉及InnoDB
表的查询执行计划稳定性产生影响。innodb_stats_on_metadata
可以使用SET
语句进行全局配置。SET GLOBAL innodb_stats_on_metadata=ON
Noteinnodb_stats_on_metadata
只在优化器统计信息配置为非持久时(当innodb_stats_persistent
被禁用时)生效。 -
使用带有
--auto-rehash
选项的mysql客户端,哪怕是默认情况下也会启用该选项。该选项导致所有InnoDB表格被打开,并且打开表格操作导致统计信息被重新计算。为了提高mysql客户端的启动时间和更新统计信息,可以使用
--disable-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_transient_sample_pages
值对所有 InnoDB
表和索引的索引采样进行影响,当 innodb_stats_persistent=0
时。请注意以下可能具有重要影响的变化时期:
-
小值,如 1 或 2 可能导致 cardinality 估计不准确。
-
增加
innodb_stats_transient_sample_pages
值可能需要更多磁盘读取。值大于 8(例如,100)可以导致打开表或执行SHOW TABLE STATUS
需要的时间增加。 -
优化器可能根据不同索引选择性估计选择非常不同的查询计划。
在系统中,设置 innodb_stats_transient_sample_pages
的值,并保持该值不变。选择一个结果对所有表的 cardinality 估计都较为准确,而不需要过多 I/O 的值。由于统计信息在执行 ANALYZE TABLE
之外自动重新计算,因此不应该增加索引采样大小,然后再减少采样大小。
较小的表通常需要少于较大的表所需的索引样本。如果您的数据库中有许多大型表,考虑将innodb_stats_transient_sample_pages
的值设置得更高,如果您主要使用较小的表。