10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

MySQL 8.0参考手册/.../ InnoDB和MyISAM索引统计

8.3.8 InnoDB和MyISAM索引统计

存储引擎收集关于表的统计信息,供优化器使用。表统计信息基于值组,其中值组是一组具有相同键前缀值的行。对于优化器而言,一个重要的统计值是平均值组大小。

MySQL使用平均组大小的方法如下:

  • 估计每一个必须读多少行裁判访问

  • 要估计部分连接产生的行数,即表单的一个操作产生的行数

    (…)加入tbl_nametbl_name关键expr

随着索引的平均值组大小的增加,索引对这两个目的的用处就会降低,因为每次查找的平均行数也会增加:要使索引适合于优化目的,最好是每个索引值都针对表中的少量行。当一个给定的索引值产生大量的行时,索引就不那么有用了,MySQL也不太可能使用它。

平均值组大小与表基数相关,即值组的数量。的显示指数的基数值N / S,在那里N表中的行数和年代是组大小的平均值。该比率产生表中值组的大致数目。

的连接< = >比较运算符,与其他值没有区别对待:空< = > NULL,就像N< = >N任何其他N

但是,对于基于运营商,是不同于非价值观:expr1expr2不是真的expr1expr2(或两者).这影响到裁判表单比较的访问tbl_name.keyexpr:如果当前值为,MySQL不访问表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表统计,您可以使用以下任何一种方法:

关于使用的一些注意事项innodb_stats_method而且myisam_stats_method

  • 可以强制显式地收集表统计信息,正如刚才所述。但是,MySQL也可以自动收集统计信息。例如,如果在执行表语句的过程中,其中一些语句修改了表,MySQL可能会收集统计信息。(这可能发生在批量插入或删除时ALTER TABLE语句,例如)。如果发生这种情况,则使用任何值收集统计信息innodb_stats_methodmyisam_stats_method当时有。因此,如果您使用一种方法收集统计信息,但是在稍后自动收集表的统计信息时将系统变量设置为另一种方法,则使用另一种方法。

  • 无法知道使用了哪种方法为给定的表生成统计信息。

  • 这些变量只适用于InnoDB而且MyISAM表。其他存储引擎只有一种收集表统计信息的方法。通常它更接近nulls_equal方法。