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_PERSISTENTSTATS_AUTO_RECALCSTATS_SAMPLE_PAGES的值来控制收集统计数据时的一些细节。

innodb_stats_method决定着在统计某个索引列中不重复的值得数量时如何对待NULL值,这个系统变量有三个候选值。

  • nulls_equal:认为所有的null值都是相等的。倾向于不使用索引进行访问。是innodb_stats_method的默认值。
  • nulls_unequal:认为所的NULL值都是不相等的,倾向于使用索引进行访问。
  • nulls_ignored:直接把NULL值忽略掉。