存储引擎收集有关优化器使用的表的统计信息。表统计信息基于值组,其中值组是具有相同密钥前缀值的一组行。对于优化器目的,重要统计学是平均值组大小。
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.
,零
价值观不被认为是相同的。相反,每个零
Value组成大小为1的单独值组。如果你有很多
零
值,此方法使平均值组大小向下偏斜。如果平均值零
值组规模大,计数零
每个值作为一组大小为1的值会导致优化器高估寻找non-的连接的索引值零
值。因此,nulls_unequal.
方法可能导致优化器使用此索引裁判
当其他方法可能更好时查找。当变量设置为时
nulls_iquored
,零
值忽略。
如果您倾向于使用许多连接使用<=>
而不是=
,零
价值观并不特殊比较和一个零
等于另一个。在这种情况下,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
方法。