### 8.3.8 InnoDB和MyISAM索引统计数据收集

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

MySQL通过以下方式使用平均值组大小：

-   估计每行必须读取多少行[`裁判`](explain-output.html#jointype_ref)通道

-   估计部分联接产生的行数，即窗体操作产生的行数

    ```
    (...) JOIN tbl_name ON tbl_name.key = expr
    ```

    随着索引的平均值组大小的增加，该索引在这两个方面的用处就越小，因为每次查找的平均行数会增加：为了使索引更好地用于优化目的，最好每个索引值都以表中的少量行为目标。当一个给定的索引值产生大量行时，该索引就不那么有用，MySQL也不太可能使用它。

    平均值组大小与表基数有关，表基数是值组的数量。这个[`显示索引`](show-index.html)语句显示基于*`不适用`*哪里*`N`*表中的行数，以及*`S`*是组大小的平均值。这个比率在表中产生了大约数量的值组。

    基于`<=>`比较运算符，`无效的`与任何其他价值没有区别：`空<=>空`，正如`*`N`* <=> *`N`*`还有别的吗*`N`*.

    但是，对于基于`=`操作人员`无效的`与非-`无效的`价值观：`*`expr1`* = *`expr2`*`当*`expr1`*或*`expr2`*（或两者）都是`无效的`.这会影响[`裁判`](explain-output.html#jointype_ref)用于比较表单的访问`*`tbl\_名称。钥匙`* = *`expr`*`：MySQL不访问该表，如果*`expr`*是`无效的`，因为这种比较不可能是真的。

    对于`=`相比之下，有多少并不重要`无效的`数值在表中。出于优化目的，相关值为非-`无效的`价值观群体。然而，MySQL目前无法收集或使用该平均大小。

    对于`InnoDB`和`米萨姆`表，您可以通过[`innodb_统计方法`](innodb-parameters.html#sysvar_innodb_stats_method)和[`myisam_统计法`](server-system-variables.html#sysvar_myisam_stats_method)分别是系统变量。这些变量有三个可能的值，其差异如下：

-   当变量设置为`空值等于`全部的`无效的`值被视为相同的（也就是说，它们都构成一个值组）。

    如果`无效的`价值群体的规模远高于非价值群体的平均规模-`无效的`值组大小，此方法将平均值组大小向上倾斜。这使得在优化器看来，索引并不像在寻找非索引的联接中那样有用-`无效的`价值观因此`空值等于`方法可能会导致优化器不将索引用于[`裁判`](explain-output.html#jointype_ref)在应该的时候访问。

-   当变量设置为`空值不相等`, `无效的`这些值被认为是不同的。相反，每个`无效的`值形成大小为1的单独值组。

    如果你有很多`无效的`值时，此方法会向下倾斜平均值组大小。如果平均不-`无效的`值组大小很大，正在计数`无效的`每个值作为一组大小为1的值，会导致优化器高估查找非-`无效的`价值观因此`空值不相等`方法可能会导致优化器将此索引用于[`裁判`](explain-output.html#jointype_ref)其他方法可能更好时进行查找。

-   当变量设置为`空值被忽略`, `无效的`值被忽略。

    如果你倾向于使用许多连接`<=>`而不是`=`, `无效的`值在比较中并不特别，只有一个`无效的`与另一个相等。在这种情况下，`空值等于`是合适的统计方法。

    这个[`innodb_统计方法`](innodb-parameters.html#sysvar_innodb_stats_method)系统变量具有全局值；这个[`myisam_统计法`](server-system-variables.html#sysvar_myisam_stats_method)系统变量既有全局值也有会话值。设置全局值会影响从相应存储引擎收集表的统计信息。设置会话值仅影响当前客户端连接的统计信息收集。这意味着您可以通过设置会话值来强制使用给定方法重新生成表的统计信息，而不会影响其他客户端[`myisam_统计法`](server-system-variables.html#sysvar_myisam_stats_method).

    再生`米萨姆`表统计信息，可以使用以下任何方法：

-   处决[**myisamchk——统计数据\_方法=*`方法名称`*--分析**](myisamchk.html)

-   更改表格，使其统计信息过期（例如，插入一行，然后删除），然后设置[`myisam_统计法`](server-system-variables.html#sysvar_myisam_stats_method)并发布[`分析表`](analyze-table.html)陈述

    关于使用[`innodb_统计方法`](innodb-parameters.html#sysvar_innodb_stats_method)和[`myisam_统计法`](server-system-variables.html#sysvar_myisam_stats_method):

-   您可以强制显式收集表统计信息，如前所述。然而，MySQL也可以自动收集统计数据。例如，如果在为表执行语句的过程中，其中一些语句修改了表，MySQL可能会收集统计信息。（批量插入或删除或某些[`改变桌子`](alter-table.html)例如，声明。）如果发生这种情况，则使用任何值来收集统计数据[`innodb_统计方法`](innodb-parameters.html#sysvar_innodb_stats_method)或[`myisam_统计法`](server-system-variables.html#sysvar_myisam_stats_method)那时候有。因此，如果使用一种方法收集统计信息，但当稍后自动收集表的统计信息时，系统变量设置为另一种方法，则使用另一种方法。

-   无法判断使用哪种方法生成给定表的统计信息。

-   这些变量仅适用于`InnoDB`和`米萨姆`桌子。其他存储引擎只有一种收集表统计信息的方法。通常情况下，它更靠近地面`空值等于`方法
