InnoDB以表为单位来收集统计数据,这些统计数据可以是基于磁盘的永久性统计数据,也可以是基于内存的非永久性统计数据。
两种不同的统计数据存储方式
基于磁盘的永久性统计数据
innodb_stats_persistent的值设置为ON时,MySQL 5.6.6默认
这两个表都位于mysql系统数据库下边,其中:
- innodb_table_stats存储了关于表的统计数据,每一条记录对应着一个表的统计数据。
innodb_index_stats存储了关于索引的统计数据,每一条记录对应着一个索引的一个统计项的统计数据。
定期更新统计数据
开启innodb_stats_auto_recalc
-
手动更新innodb_table_stats和innodb_index_stats表
基于内存的非永久性统计数据
innodb_stats_method的使用
系统变量有三个候选值:
nulls_equal:认为所有NULL值都是相等的。这个值也是innodb_stats_method的默认值。如果某个索引列中NULL值特别多的话,这种统计方式会让优化器认为某个列中平均一个值重复次数特别多,所以倾向于不使用索引进行访问。
- nulls_unequal:认为所有NULL值都是不相等的。如果某个索引列中NULL值特别多的话,这种统计方式会让优化器认为某个列中平均一个值重复次数特别少,所以倾向于使用索引进行访问。
-
总结
InnoDB以表为单位来收集统计数据,这些统计数据可以是基于磁盘的永久性统计数据,也可以是基于内存的非永久性统计数据。
- innodb_stats_persistent控制着使用永久性统计数据还是非永久性统计数据;innodb_stats_persistent_sample_pages控制着永久性统计数据的采样页面数量;innodb_stats_transient_sample_pages控制着非永久性统计数据的采样页面数量;innodb_stats_auto_recalc控制着是否自动重新计算统计数据。
- 我们可以针对某个具体的表,在创建和修改表时通过指定STATS_PERSISTENT、STATS_AUTO_RECALC、STATS_SAMPLE_PAGES的值来控制相关统计数据属性。
- innodb_stats_method决定着在统计某个索引列不重复值的数量时如何对待NULL值。
