13.8.2 EXPLAIN 声明
{EXPLAIN | DESCRIBE | DESC}
tbl_name [col_name | wild]
{EXPLAIN | DESCRIBE | DESC}
[explain_type]
{explainable_stmt | FOR CONNECTION connection_id}
explain_type: {
EXTENDED
| PARTITIONS
| FORMAT = format_name
}
format_name: {
TRADITIONAL
| JSON
}
explainable_stmt: {
SELECT statement
| DELETE statement
| INSERT statement
| REPLACE statement
| UPDATE statement
}
DESCRIBE和EXPLAIN语句是同义词。实际上,DESCRIBE关键字通常用于获取有关 table 结构的信息,而EXPLAIN则用于获取查询执行计划(即,有关 MySQL 如何执行查询的说明)。
以下讨论根据这些用法使用DESCRIBE和EXPLAIN关键字,但是 MySQL 分析器将它们视为完全同义词。
获取 table 结构信息
DESCRIBE提供有关 table 中列的信息:
mysql> DESCRIBE City;
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| Country | char(3) | NO | UNI | | |
| District | char(20) | YES | MUL | | |
| Population | int(11) | NO | | 0 | |
+------------+----------+------+-----+---------+----------------+
DESCRIBE是SHOW COLUMNS的快捷方式。这些语句还显示视图信息。 SHOW COLUMNS的描述提供有关输出列的更多信息。参见第 13.7.5.5 节“ SHOW COLUMNS 语句”。
默认情况下,DESCRIBE显示有关 table 中所有列的信息。 * col_name
*(如果提供)是 table 中列的名称。在这种情况下,该语句仅显示有关命名列的信息。 * wild
*(如果给出)是一个模式字符串。它可以包含 SQL %
和_
通配符。在这种情况下,该语句仅显示名称与字符串匹配的列的输出。除非字符串包含空格或其他特殊字符,否则无需将其用引号引起来。
提供DESCRIBE语句是为了与 Oracle 兼容。
显示创建 table,显示 table 格状态和SHOW INDEX语句还提供有关 table 的信息。参见第 13.7.5 节“ SHOW 语句”。
获取执行计划信息
EXPLAIN语句提供有关 MySQL 如何执行语句的信息:
-
当EXPLAIN与可解释的语句一起使用时,MySQL 将显示来自优化器的有关语句执行计划的信息。也就是说,MySQL 解释了它将如何处理该语句,包括有关如何连接 table 以及以何种 Sequences 连接 table 的信息。有关使用EXPLAIN获取执行计划信息的信息,请参见第 8.8.2 节“ EXPLAIN 输出格式”。
-
当EXPLAIN与
FOR CONNECTION connection_id
而不是可解释的语句一起使用时,它将显示在命名 Connecting 执行的语句的执行计划。参见第 8.8.4 节“获取命名连接的执行计划信息”。 -
对于SELECT语句,EXPLAIN生成可以使用SHOW WARNINGS显示的其他执行计划信息。参见第 8.8.3 节“扩展的 EXPLAIN 输出格式”。
Note
在较早的 MySQL 版本中,扩展信息是使用EXPLAIN EXTENDED生成的。仍然可以识别该语法以实现向后兼容性,但是默认情况下现在启用了扩展输出,因此EXTENDED
关键字是多余的并且已弃用。它的使用会产生警告,并且已从 MySQL 8.0 的EXPLAIN语法中删除。
- EXPLAIN对于检查涉及分区 table 的查询很有用。参见第 22.3.5 节“获取有关分区的信息”。
Note
在较早的 MySQL 版本中,分区信息是使用EXPLAIN PARTITIONS生成的。仍然可以识别该语法以实现向后兼容性,但是默认情况下现在启用了分区输出,因此PARTITIONS
关键字是多余的并且已弃用。它的使用会产生警告,并且已从 MySQL 8.0 的EXPLAIN语法中删除。
FORMAT
选项可用于选择输出格式。TRADITIONAL
以 table 格格式显示输出。如果不提供FORMAT
选项,则为默认设置。JSON
格式以 JSON 格式显示信息。
EXPLAIN要求具有执行说明语句所需的相同特权。此外,对于任何已解释的视图,EXPLAIN还需要SHOW VIEW特权。
借助EXPLAIN,您可以看到应该在哪里向 table 添加索引,以便通过使用索引查找行来使语句更快地执行。您也可以使用EXPLAIN来检查优化器是否以最佳 Sequences 连接 table。要提示优化器使用与SELECT语句中 table 的命名 Sequences 相对应的连接 Sequences,请以SELECT STRAIGHT_JOIN
而不是SELECT开头该语句。 (请参见第 13.2.9 节“ SELECT 语句”。)
优化器跟踪有时可能提供与EXPLAIN互补的信息。但是,优化程序的跟踪格式和内容在版本之间可能会发生变化。有关详细信息,请参见MySQL 内部:跟踪优化器。
如果您在认为应该使用索引时遇到问题,请运行ANALYZE TABLE以更新 table 统计信息(例如,键的基数),这可能会影响优化器的选择。参见第 13.7.2.1 节“ ANALYZE TABLE 语句”。
Note
MySQL Workbench 具有视觉解释功能,该视觉解释提供了EXPLAIN输出的视觉 table 示。参见教程:使用 Explain 改善查询性能。