InnoDB
以表为单位来收集统计数据,这些数据可以是基于磁盘的永久性数据,也可以是基于内存的而非永久性统计数据。
- 永久性地存储统计数据:统计数据存储在磁盘上,在服务器重启之后这些统计数据依然存在。
- 非永久性地存储统计数据:统计数据存储在内存上,当服务器关闭时这些统计数据就被清除掉,等到服务器重启之后,在某些适当的场景下会重新收集这些统计数据。
innodb_stats_persistent
控制着服务器使用的永久性统计数据还是非永久性统计数据,控制统计数据存储到何处,在MySQL 5.6.6
版本之后, innodb_stats_persistent
值默认是ON
,也就是统计数据默认被存到磁盘上。
按照一定算法,从聚簇索引中选取几个叶子节点页面,统计每个页面中包含的记录数量,然后计算一个页面中平均包含的记录数量,并将其乘以全部叶子节点的数量,结果就是
n_rows
的值。
innodb_stats_persistent_sample_pages
控制着永久性统计数据的采样页面数量,它的默认值是8,该值设置的越大,统计的n_rows
值越精确,但是统计耗时也得最久,改值设置的越小,统计n_rows
值越不精确,但是统计耗时也就越少。
innodb_stats_auto_recalc
控制着是否自动重新计算统计数据,每个表维护了一个变量,该变量记录着对该表进行增删查改的记录条数,如果发生变动的记录数量超过了表大小的10%
,并且自动重新计算统计数据的功能是打开的(默认是ON
,打开状态),那么服务器就会重新计算一次统计数据。
我们可以在创建和修改表时通过指定STATS_PERSISTENT
、STATS_AUTO_RECALC
、STATS_SAMPLE_PAGES
的值来控制收集统计数据时的一些细节。
innodb_stats_method
决定着在统计某个索引列中不重复的值得数量时如何对待NULL值,这个系统变量有三个候选值。
-
nulls_equal
:认为所有的null
值都是相等的。倾向于不使用索引进行访问。是innodb_stats_method
的默认值。 -
nulls_unequal
:认为所的NULL
值都是不相等的,倾向于使用索引进行访问。 -
nulls_ignored
:直接把NULL
值忽略掉。