自动收集和手动收集,由参数innodb_stats_auto_recalc控制,默认为ON。
自动收集根据统计信息存储方式的不同有不同的触发条件。
关闭自动收集功能,需通过analyze table手动更新。MySQL统计信息存储方式分为:持久化和非持久化,由参数innodb_stats_persistent控制,默认为ON。
持久化会将统计信息保存至磁盘上。
非持久化仅将统计信息存储在内存中,当数据库重启后,统计信息将丢失。非持久化统计信息触发条件:
mysql.innodb_table_stats
mysql.innodb_index_statsMySQL统计信息如何计算:
MySQL的统计数据是基于采样数据估算的,不同存储方式的统计信息的采样大小由不同的参数控制:
持久化统计信息:innodb_stats_persistent_sample_pages,默认20pages
非持久化统计信息:innodb_stats_transient_sample_pages,默认8pages
也就是说在持久化统计信息下,当InnoDB更新优化程序统计信息时,它会对表中每个索引的随机页面进行采样,以估计索引的基数。根据官方文档介绍:需要扫描的统计信息大小为:innodb_stats_persistent_sample_pages的值*表中索引列的数量*分区数如果发现得出的执行计划不准确,可以通过增大采样大小来产生更准确的估计值。但是采样大小过大会导致生成统计时间过长,造成过多性能消耗。