### 8.8.1 使用 EXPLAIN 优化查询

[](<>)[](<>)

这[`解释`](explain.html)语句提供有关 MySQL 如何执行语句的信息：

-   [`解释`](explain.html)与[`选择`](select.html),[`删除`](delete.html),[`插入`](insert.html),[`代替`](replace.html)， 和[`更新`](update.html)陈述。

-   什么时候[`解释`](explain.html)与可解释语句一起使用时，MySQL 会显示来自优化器的有关语句执行计划的信息。也就是说，MySQL 解释了它将如何处理该语句，包括有关表如何连接以及以何种顺序连接的信息。有关使用的信息[`解释`](explain.html)要获取执行计划信息，请参阅[第 8.8.2 节，“解释输出格式”](explain-output.html).

-   什么时候[`解释`](explain.html)与`连接 *`连接ID`*`它不是可解释的语句，而是显示在命名连接中执行的语句的执行计划。看[第 8.8.4 节，“获取命名连接的执行计划信息”](explain-for-connection.html).

-   为了[`选择`](select.html)陈述，[`解释`](explain.html)生成可以使用显示的附加执行计划信息[`显示警告`](show-warnings.html).看[第 8.8.3 节，“扩展 EXPLAIN 输出格式”](explain-extended.html).

-   [`解释`](explain.html)对于检查涉及分区表的查询很有用。看[第 24.3.5 节，“获取有关分区的信息”](partitioning-info.html).

-   这`格式`选项可用于选择输出格式。`传统的`以表格格式显示输出。如果没有，这是默认值`格式`选项存在。`JSON`format 以 JSON 格式显示信息。

[](<>)在...的帮助下[`解释`](explain.html)，您可以看到应该在哪里为表添加索引，以便通过使用索引查找行来更快地执行语句。你也可以使用[`解释`](explain.html)检查优化器是否以最佳顺序连接表。提示优化器使用与表命名顺序相对应的连接顺序[`选择`](select.html)声明，以声明开头`选择 STRAIGHT_JOIN`而不仅仅是[`选择`](select.html).（看[第 13.2.10 节，“SELECT 语句”](select.html)。） 然而，`STRAIGHT_JOIN`可能会阻止使用索引，因为它禁用了半连接转换。看[第 8.2.2.1 节，“使用半连接转换优化 IN 和 EXISTS 子查询谓词”](semijoins.html).

优化器跟踪有时可能会提供与[`解释`](explain.html).但是，优化器跟踪格式和内容可能会因版本而异。有关详细信息，请参阅[MySQL 内部：跟踪优化器](https://dev.mysql.com/doc/internals/en/optimizer-tracing.html).

如果您认为应该使用的索引没有被使用，请运行[`分析表`](analyze-table.html)更新表统计信息，例如键的基数，这可能会影响优化器所做的选择。看[第 13.7.3.1 节，“ANALYZE TABLE 语句”](analyze-table.html).

笔记

[`解释`](explain.html)也可用于获取有关表中列的信息。[`解释 *`tbl_name`*`](explain.html)是同义词`描述 *`tbl_name`*`和`显示来自 * 的列`tbl_name`*`.有关详细信息，请参阅[第 13.8.1 节，“DESCRIBE 语句”](describe.html)， 和[第 13.7.7.5 节，“显示列语句”](show-columns.html).
