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
}

DESCRIBEEXPLAIN语句是同义词。实际上,DESCRIBE关键字通常用于获取有关 table 结构的信息,而EXPLAIN则用于获取查询执行计划(即,有关 MySQL 如何执行查询的说明)。

以下讨论根据这些用法使用DESCRIBEEXPLAIN关键字,但是 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       |                |
+------------+----------+------+-----+---------+----------------+

DESCRIBESHOW 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 如何执行语句的信息:

Note

在较早的 MySQL 版本中,扩展信息是使用EXPLAIN EXTENDED生成的。仍然可以识别该语法以实现向后兼容性,但是默认情况下现在启用了扩展输出,因此EXTENDED关键字是多余的并且已弃用。它的使用会产生警告,并且已从 MySQL 8.0 的EXPLAIN语法中删除。

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 改善查询性能