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

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

8.3.7 InnoDB和MyISAM索引统计

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

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

  • 来估计每个对象必须读取多少行裁判访问

  • 估计部分连接产生多少行;也就是说,这种形式的操作产生的行数:

    (…)加入tbl_nametbl_name关键expr

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

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

属性的连接< = >比较运算符,与其他值没有区别对待:Null <=> Null,就像N< = >N对于其他的N

属性的连接运营商,和non-价值观:expr1expr2不是真的,当expr1expr2(或者两者都是).这影响到裁判用于表单比较的访问tbl_name.keyexpr的当前值,MySQL不访问该表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表统计,您可以使用以下任何一种方法:

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

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

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

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