InnoDB
以表为单位来收集统计数据
InnoDB
提供了两种存储统计数据的方式:
-
永久性的统计数据(磁盘中)
这种统计数据存储在磁盘上,也就是服务器重启之后这些统计数据还在。
-
非永久性的统计数据(内存中)
这种统计数据存储在内存中,当服务器关闭时这些这些统计数据就都被清除掉了,等到服务器重启之后,在某些适当的场景下才会重新收集这些统计数据。
控制存储方式的系统变量:innodb_stats_persistent
的值默认是OFF
,默认是存储到内存的,之后的版本中innodb_stats_persistent
的值默认是ON
,也就是统计数据默认被存储到磁盘中。
我们可以在创建和修改表的时候通过指定STATS_PERSISTENT
属性来指明该表的统计数据存储方式:
STATS_PERSISTENT=1默认在磁盘中
STATS_PERSISTENT=0默认在内存中
基于磁盘的永久性统计数据
当我们选择把某个表以及该表索引的统计数据存放到磁盘上时,实际上是把这些统计数据存储到了两个表里:
-
innodb_table_stats
存储了关于表的统计数据,每一条记录对应着一个表的统计数据。 -
innodb_index_stats
存储了关于索引的统计数据,每一条记录对应着一个索引的一个统计项的统计数据。
定期更新统计数据
开启系统变量innodb_stats_auto_recalc,默
认值是ON,默认开启。
手动调用ANALYZE TABLE
语句来更新统计信息
手动更新innodb_table_stats
和innodb_index_stats
表
基于内存的非永久性统计数据
非永久性的统计数据采样的页面数量是由innodb_stats_transient_sample_pages
控制的,这个系统变量的默认值是8
。
小总结:
-
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
值。