InnoDB以表为单位来收集统计数据,这些统计数据可以是基于磁盘的永久性统计数据,也可以是基于内存的非永久性统计数据。

两种不同的统计数据存储方式

基于磁盘的永久性统计数据

innodb_stats_persistent的值设置为ON时,MySQL 5.6.6默认
这两个表都位于mysql系统数据库下边,其中:

  • innodb_table_stats存储了关于表的统计数据,每一条记录对应着一个表的统计数据。
  • innodb_index_stats存储了关于索引的统计数据,每一条记录对应着一个索引的一个统计项的统计数据。

    定期更新统计数据

  • 开启innodb_stats_auto_recalc

  • 手动调用ANALYZE TABLE语句来更新统计信息

    手动更新innodb_table_stats和innodb_index_stats表

    基于内存的非永久性统计数据

    innodb_stats_method的使用

    系统变量有三个候选值:

  • nulls_equal:认为所有NULL值都是相等的。这个值也是innodb_stats_method的默认值。如果某个索引列中NULL值特别多的话,这种统计方式会让优化器认为某个列中平均一个值重复次数特别多,所以倾向于不使用索引进行访问。

  • nulls_unequal:认为所有NULL值都是不相等的。如果某个索引列中NULL值特别多的话,这种统计方式会让优化器认为某个列中平均一个值重复次数特别少,所以倾向于使用索引进行访问。
  • nulls_ignored:直接把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值。