MySQL统计信息收集方式分为:
自动收集和手动收集,由参数innodb_stats_auto_recalc控制,默认为ON。 自动收集根据统计信息存储方式的不同有不同的触发条件。 关闭自动收集功能,需通过analyze table手动更新。
MySQL统计信息存储方式分为:
持久化和非持久化,由参数innodb_stats_persistent控制,默认为ON。 持久化会将统计信息保存至磁盘上。 非持久化仅将统计信息存储在内存中,当数据库重启后,统计信息将丢失。
非持久化统计信息触发条件:
官方文档URL:https://dev.mysql.com/doc/refman/5.7/en/innodb-statistics-estimation.html 1.执行analyze table 2.innodb_stats_on_metadata=ON情况下,执行SHOW TABLE STATUS, SHOW INDEX. 或查询 INFORMATION_SCHEMA下的TABLES, STATISTICS 3.启用--auto-rehash功能的情况下,通过mysql client登录 4.表首次被打开(访问) 5.距上一次更新统计信息之后,表中1/16的数据被修改
持久化统计信息触发条件:
官方文档URL:https://dev.mysql.com/doc/refman/5.7/en/innodb-persistent-stats.html 1.执行analyze table 2.INNODB_STATS_AUTO_RECALC=ON的情况下,表中10%的数据被修改
持久化统计信息存储位置:
mysql.innodb_table_stats mysql.innodb_index_stats
MySQL统计信息如何计算:
MySQL的统计数据是基于采样数据估算的,不同存储方式的统计信息的采样大小由不同的参数控制: 持久化统计信息:innodb_stats_persistent_sample_pages,默认20pages 非持久化统计信息:innodb_stats_transient_sample_pages,默认8pages 也就是说在持久化统计信息下,当InnoDB更新优化程序统计信息时,它会对表中每个索引的随机页面进行采样,以估计索引的基数。根据官方文档介绍:需要扫描的统计信息大小为:innodb_stats_persistent_sample_pages的值*表中索引列的数量*分区数如果发现得出的执行计划不准确,可以通过增大采样大小来产生更准确的估计值。但是采样大小过大会导致生成统计时间过长,造成过多性能消耗。
文章转载自数据库笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




