存储引擎收集有关表的统计信息,以供优化器使用。表统计信息基于值组,其中值组是具有相同键前缀值的行集。对于优化器而言,一个重要的统计数据是组大小的平均值。
MySQL使用平均值组大小的方式如下:
来估计每个对象必须读取多少行
裁判
访问估计部分连接产生多少行;也就是说,这种形式的操作产生的行数:
(…)加入tbl_name在tbl_name.关键=expr
随着索引的平均值组大小的增加,索引对这两个目的的用处会降低,因为每次查找的平均行数会增加:为了使索引有利于优化目的,最好每个索引值针对表中的少量行。当一个给定的索引值产生大量的行时,索引就不那么有用,MySQL也不太可能使用它。
平均值组大小与表基数有关,即值组的数量。的显示指数
语句显示的基数值N / S
,在那里N
表中的行数和年代
是组大小的平均值。该比率产生表中值组的大致数目。
属性的连接< = >
比较运算符,零
与其他值没有区别对待:Null <=> Null
,就像
对于其他的N
< = >N
N
.
属性的连接=
运营商,零
和non-零
价值观:
不是真的,当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
,零
值不被认为是相同的。相反,每个零
Value形成一个大小为1的单独值组。如果你有很多
零
值时,此方法向下倾斜平均值组大小。若平均值非零
值组大小较大,计数零
将each作为一组大小为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
方法。