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
}

描述说明 statements 是同义词。在实践中,描述关键字更常用于获取有关 table 结构的信息,而说明用于获取查询执行计划(即,MySQL 如何执行查询的说明)。

以下讨论根据这些用途使用描述说明关键字,但 MySQL 解析器将它们视为完全同义。

获取 Table 结构信息

描述提供有关 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       |                |
+------------+----------+------+-----+---------+----------------+

描述显示列的快捷方式。这些语句还显示视图的信息。 显示列的描述提供了有关输出列的更多信息。见第 13.7.5.5 节,“显示列语法”

默认情况下,描述显示有关 table 中所有列的信息。 col_name,如果给定,则是 table 中列的 name。在这种情况下,该语句仅显示指定列的信息。 wild,如果给定,则是 pattern string。它可以包含 SQL %_通配符。在这种情况下,语句仅显示名称与 string 匹配的列的输出。除非 string 包含空格或其他特殊字符,否则无需将 string 括在引号内。

提供描述语句是为了与 Oracle 兼容。

显示创建 TABLE显示 TABLE 状态显示索引 statements 还提供有关表的信息。见第 13.7.5 节,“显示语法”

获取执行计划信息

说明语句提供有关 MySQL 如何执行 statements 的信息:

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

注意 在较早的 MySQL 版本中,分区信息是使用解释分区生成的。对于向后兼容性,仍然可以识别该语法,但默认情况下现在启用分区输出,因此PARTITIONS关键字是多余的并且已弃用。它的使用会产生警告,并在 MySQL 8.0 中从说明语法中删除。

  • FORMAT选项可用于选择输出格式。 TRADITIONAL以表格格式显示输出。如果不存在FORMAT选项,则这是默认值。 JSON format 以 JSON 格式显示信息。

说明要求访问的任何表或视图具有选择特权,包括任何基础视图表。对于视图,说明也需要显示视图特权。

说明的帮助下,您可以看到应该在哪里向表添加索引,以便通过使用索引查找行来更快地执行语句。您还可以使用说明来检查优化程序是否以最佳 order 连接表。要提示优化器使用与选择语句中指定表的 order 对应的 join order,请使用SELECT STRAIGHT_JOIN而不是选择开始语句。 (见第 13.2.9 节,“ SELECT 语法” .)

优化器跟踪有时可以提供与说明的信息互补的信息。但是,优化程序跟踪格式和内容可能会在不同版本之间发生变化。有关详细信息,请参阅MySQL 内部:跟踪优化器

如果您认为索引未被使用时遇到问题,则 run 分析 TABLE更新 table 统计信息,例如键的基数,这可能会影响优化程序所做的选择。见第 13.7.2.1 节,“ANALYZE TABLE 语法”

注意 MySQL Workbench 具有 Visual Explain 功能,可提供说明输出的直观表示。见教程:使用 Explain 改进查询性能