一、MySQL统计信息的分类
InnoDB的统计信息分为持久化统计信息和非持久化统计信息两类。
持久化统计信息在服务器重启期间持久化,从而实现更大的计划稳定性和更一致的查询性能。持久统计信息还提供了控制和灵活性,还有以下额外好处:
1. 可以使用innodb_stats_auto_recalc配置选项来控制表发生重大更改后统计信息是否自动更新。
2. 您可以在CREATE TABLE和ALTER TABLE语句中使用STATS_PERSISTENT、STATS_AUTO_RECALC和STATS_SAMPLE_PAGES子句来配置各个表的优化统计信息。
3. 您可以在mysql中查询优化器统计数据。mysql.innodb_table_stats和mysql.innodb_index_stats表。
4. 可以查看last_update在mysql.innodb_table_stats和mysql.Innodb_index_stats表,查看上一次更新统计信息的时间。
5. 您可以手动修改mysql.innodb_table_stats和mysql.Innodb_index_stats表强制执行一个特定的查询优化计划,或者在不修改数据库的情况下测试替代计划。
默认情况下,持久化优化器统计特性是启用的(innodb_stats_persistent=ON)。
非持久性优化器统计信息将在每次服务器重启和一些其他操作之后清除,并在下一次访问表时重新计算。因此,在重新计算统计信息时可能产生不同的估计,从而导致执行计划的不同选择和查询性能的变化。
二、持久化统计信息的更新
持久化优化器统计特性通过将统计数据存储到磁盘并使它们在服务器重启时持久化来提高计划的稳定性,以便优化器更有可能每次对给定的查询做出一致的选择。
当innodb_stats_persistent=ON或使用STATS_PERSISTENT=1定义单个表时,优化器统计信息将持久化到磁盘。默认启用Innodb_stats_persistent。
innodb_stats_auto_recalc变量是默认启用的,它控制当一个表的行发生更改超过10%时是否自动计算统计信息。您还可以在创建或修改表时指定STATS_AUTO_RECALC子句,从而为单个表配置自动统计重新计算。
由于自动统计数据重新计算的异步特性(它发生在后台),在运行影响一个表10%以上的DML操作后,统计数据可能不会立即重新计算,即使启用了innodb_stats_auto_recalc。在某些情况下,统计数据的重新计算可能会延迟几秒钟。如果立即需要最新的统计信息,则运行ANALYZE TABLE来启动统计信息的同步(前台)重新计算。
如果innodb_stats_auto_recalc被禁用,您可以通过在对索引列进行重大更改后执行ANALYZE TABLE语句来确保优化器统计数据的准确性。您还可以考虑将ANALYZE TABLE添加到加载数据后运行的设置脚本中,并在低活动时按计划运行ANALYZE TABLE。
当向现有表添加索引或添加或删除列时,索引统计信息将计算并添加到innodb_index_stats表中,而不考虑innodb_stats_auto_recalc的值。
以前,在重新启动服务器和执行其他类型的操作后,会清除优化器统计信息,并在下一次访问表时重新计算。因此,在重新计算统计信息时会产生不同的估计,从而导致查询执行计划的不同选择和查询性能的变化。
三、非持久化统计信息的更新
非持久性优化器统计信息在以下情况下更新:
1. 运行ANALYZE TABLE.。
2. 执行SHOW TABLE STATUS、SHOW INDEX或查询INFORMATION_SCHEMA表或INFORMATION_SCHEMA。启用innodb_stats_on_metadata选项的统计表。
3. innodb_stats_on_metadata的默认设置是OFF。启用innodb_stats_on_metadata可能会降低拥有大量表或索引的模式的访问速度,并且会降低涉及InnoDB表的查询的执行计划的稳定性。innodb_stats_on_metadata使用SET语句进行全局配置。
SET GLOBAL innodb_stats_on_metadata=ON
4. 启用——auto-rehash选项启动mysql客户端,这是默认设置。auto-rehash选项会导致所有InnoDB表被打开,而打开表的操作会导致统计重新计算。
为了提高mysql客户端的启动时间和更新统计信息,可以使用——disable-auto-rehash选项关闭自动重新散列。自动重新散列特性允许交互式用户自动完成数据库、表和列名的名称。
5. 首次打开表。
6. InnoDB检测到自从上次统计数据更新以来,有1 / 16的表被修改了。
四、统计信息不准确处理方法
我们查看执行计划,发现未使用正确的索引,如果是innodb_index_stats中统计信息差别较大引起,可通过以下方式处理:
1、手动更新统计信息,注意执行过程中会加读锁:
ANALYZE TABLE TABLE_NAME;
2、如果更新后统计信息仍不准确,可考虑增加表采样的数据页,两种方式可以修改:
a) 全局变量INNODB_STATS_PERSISTENT_SAMPLE_PAGES,默认为20;
b) 单个表可以指定该表的采样:
ALTER TABLE TABLE_NAME STATS_SAMPLE_PAGES=40;
经测试,此处STATS_SAMPLE_PAGES的最大值是65535,超出会报错。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




