存储引擎收集关于表的统计信息,供优化器使用。表统计信息基于值组,其中值组是一组具有相同键前缀值的行。对于优化器而言,一个重要的统计值是平均值组大小。
MySQL使用平均组大小的方法如下:
估计每一个必须读多少行
裁判
访问要估计部分连接产生的行数,即表单的一个操作产生的行数
(…)加入tbl_name在tbl_name.关键=expr
随着索引的平均值组大小的增加,索引对这两个目的的用处就会降低,因为每次查找的平均行数也会增加:要使索引适合于优化目的,最好是每个索引值都针对表中的少量行。当一个给定的索引值产生大量的行时,索引就不那么有用了,MySQL也不太可能使用它。
平均值组大小与表基数相关,即值组的数量。的显示指数
的基数值N / S
,在那里N
表中的行数和年代
是组大小的平均值。该比率产生表中值组的大致数目。
的连接< = >
比较运算符,零
与其他值没有区别对待:空< = > NULL
,就像
任何其他N
< = >N
N
.
但是,对于基于=
运营商,零
是不同于非零
价值观:
不是真的expr1
=expr2
expr1
或expr2
(或两者)零
.这影响到裁判
表单比较的访问
:如果当前值为,MySQL不访问表tbl_name.key
=expr
expr
是零
,因为这种比较不可能是真的。
为=
攀比,无所谓有多少零
值在表中。为达到优化目的,相关值为非的平均大小零
值组。然而,MySQL目前不支持收集或使用这个平均大小。
为InnoDB
而且MyISAM
方法对表统计信息的收集具有一定的控制innodb_stats_method
而且myisam_stats_method
分别系统变量。这些变量有三个可能的值,分别如下:
当变量设置为
nulls_equal
,所有零
值被视为相同的(也就是说,它们都形成一个值组)。如果
零
值组的大小远高于非平均值零
值组大小,此方法使平均值组大小向上倾斜。这使得索引在优化器看来比它在寻找非连接时的实际作用要小零
值。因此,nulls_equal
方法可能导致优化器不使用索引裁判
该访问时访问。当变量设置为
nulls_unequal
,零
价值观不被认为是相同的。相反,每个零
值组成一个大小为1的单独值组。如果你有很多
零
值,此方法向下倾斜平均值组大小。如果平均非零
值组大小大,正在计数零
每个值作为一个大小为1的组,会导致优化器过高估计查找非的连接的索引值零
值。因此,nulls_unequal
方法可能导致优化器将此索引用于裁判
在其他方法可能更好的情况下进行查找。当变量设置为
nulls_ignored
,零
值将被忽略。
如果您倾向于使用多个连接,那么使用< = >
而不是=
,零
值在比较和1中不是特殊的零
等于另一个。在这种情况下,nulls_equal
是适当的统计方法。
的innodb_stats_method
系统变量具有全局值;的myisam_stats_method
系统变量有全局值和会话值。设置全局值会影响从相应存储引擎收集表的统计信息。设置会话值只影响当前客户端连接的统计信息收集。这意味着您可以通过设置的会话值,强制使用给定的方法重新生成表的统计信息,而不影响其他客户机myisam_stats_method
.
重新生成MyISAM
表统计,您可以使用以下任何一种方法:
更改表,使其统计信息过期(例如,插入一行然后删除它),然后设置
myisam_stats_method
和问题分析表
声明
关于使用的一些注意事项innodb_stats_method
而且myisam_stats_method
:
可以强制显式地收集表统计信息,正如刚才所述。但是,MySQL也可以自动收集统计信息。例如,如果在执行表语句的过程中,其中一些语句修改了表,MySQL可能会收集统计信息。(这可能发生在批量插入或删除时
ALTER TABLE
语句,例如)。如果发生这种情况,则使用任何值收集统计信息innodb_stats_method
或myisam_stats_method
当时有。因此,如果您使用一种方法收集统计信息,但是在稍后自动收集表的统计信息时将系统变量设置为另一种方法,则使用另一种方法。无法知道使用了哪种方法为给定的表生成统计信息。
这些变量只适用于
InnoDB
而且MyISAM
表。其他存储引擎只有一种收集表统计信息的方法。通常它更接近nulls_equal
方法。