【翻译】EXPLAIN语句的语法

原文链接:http://dev.mysql.com/doc/refman/5.7/en/explain.html

一、语法

1. 语法格式-1

  1. {EXPLAIN | DESCRIBE | DESC}
  2. tbl_name [col_name | wild]

2. 语法格式-2

  1. {EXPLAIN | DESCRIBE | DESC}
  2. [explain_type]
  3. {explainable_stmt | FOR CONNECTION connection_id}

3. 选项取值

  • explain_type的可能取值:

    1. explain_type: {
    2. EXTENDED
    3. | PARTITIONS
    4. | FORMAT = format_name
    5. }
  • format_name的可能取值:

    1. format_name: {
    2. TRADITIONAL
    3. | JSON
    4. }
  • explainable_stmt的可能取值:

    1. explainable_stmt: {
    2. SELECT statement
    3. | DELETE statement
    4. | INSERT statement
    5. | REPLACE statement
    6. | UPDATE statement
    7. }

DESCRIBEEXPLAIN是同义词。实际上,DESCRIBE关键字更常用于获取表结构的相关信息,而EXPLAIN关键字则用于获取一个查询语句的执行计划(也就是说,解释MySQL如何执行一条查询语句)。下面的讨论将会按照上述的用法使用DESCRIBEEXPLAIN关键字,但是MySQL解析器会将这两个关键字完全当做同义词来处理。

二、获取表结构信息

DESCRIBE关键字可以提供一张表中列的相关信息。

  1. mysql> DESCRIBE City;
  2. +------------+----------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +------------+----------+------+-----+---------+----------------+
  5. | Id | int(11) | NO | PRI | NULL | auto_increment |
  6. | Name | char(35) | NO | | | |
  7. | Country | char(3) | NO | UNI | | |
  8. | District | char(20) | YES | MUL | | |
  9. | Population | int(11) | NO | | 0 | |
  10. +------------+----------+------+-----+---------+----------------+

DESCRIBE关键字是SHOW COLUMNS语句的简写。这些语句还能显示视图的相关信息。SHOW COLUMNS语句的描述能够提供更多关于输出列的信息。请参考《SHOW COLUMNS语句的语法》。

默认情况下,DESCRIBE关键字会显示表中所有列的相关信息。col_name(如果给定)是表中某列的名称。在这种情况下,这条语句只会显示col_name指定的列的相关信息。wild(如果给定)是一个模式字符串。它可以包含SQL的“%”和“_”通配符。在这种情况下,这条语句只会显示列名匹配wild指定的模式字符串的列的相关信息。除非字符串包含空格或其他特殊字符,否则不需要将这个字符串放在封闭的引号之内。

DESCRIBE语句还兼容于Oracle数据库。

SHOW CREATE TABLESHOW TABLE STATUSSHOW INDEX语句也会提供表相关的信息。请参考《SHOW语句的语法》。

三、获取执行计划信息

EXPLAIN语句可以提供MySQL如何执行语句的相关信息:

  • 在MySQL的5.7版本中,适用于EXPLAIN的可解释语句包括SELECTDELETEINSERTREPLACEUPDATE

  • 当对一条可解释语句使用EXPLAIN关键字时,MySQL会显示由优化器发来的信息,这些信息和语句执行计划有关。也就是说,MySQL会显示它将如何处理这条语句,包括如何联接表,以及如何排序等相关信息。若要了解更多关于如何使用EXPLAIN关键字获取执行计划的相关信息,请参考《EXPLAIN语句的输出格式》。

  • 当对FOR CONNECTION connection_id语句而不是可解释语句使用EXPLAIN关键字时,它会显示在这个指定连接中执行的语句的执行计划。请参考《获取指定连接的执行计划信息》。

  • EXPLAIN EXTENDED语句可用于获取额外的执行计划相关信息。请参考《EXPLAIN EXTENDED语句的输出格式》。

  • 从MySQL的5.7.3版本开始,已经对EXPLAIN语句修改过了,EXPLAIN语句的输出总是具有EXTENDED关键字的效果。EXTENDED关键字依然保持向后的兼容性,但这个关键字已经是多余的,并且是过时的。使用EXTENDED关键字会输出一条警告信息。在MySQL的未来发行版本中,可能会从EXPLAIN关键字的语法中移除EXTENDED关键字。

  • EXPLAIN PARTITIONS语句可用于检查涉及分区表的查询语句。请参考《获取分区的有关信息》。

    从MySQL的5.7.3版本开始,已经对EXPLAIN语句修改过了,EXPLAIN语句的输出总是具有PARTITIONS关键字的效果。PARTITIONS关键字仍然保持向后的兼容性,但这个关键字已经是多余的,并且是过时的。使用PARTITIONS关键字会输出一条警告信息。在MySQL的未来发行版本中,可能会从EXPLAIN关键字的语法中移除PARTITIONS关键字。

  • FORMAT选项可用于选择输出格式。TRADITIONAL格式会以表格的方式显示输出信息。如果没有指定FORMAT选项,那么这就是默认的显示格式。JSON格式会以JSON的方式显示输出信息。若FORMAT = JSON,则输出信息会包含扩展信息和分区信息。

EXPLAIN的帮助之下,你会发现应当在何处为表添加索引,如果通过索引来查找行,那么将会大幅提升查询语句的执行速度。你还可以使用EXPLAIN来检查优化器是否以一种优化顺序将表联接起来。如果想要提醒优化器按照SELECT语句中的表的出现顺序来决定联接顺序,那么请使用SELECT STRAIGHT_JOIN语句,而不是SELECT语句。(请参考《SELECT语句的语法》。)

优化器跟踪有时候可以提供EXPLAIN所没有的补充信息。但是,优化器跟踪的输出格式和内容会随着版本改变而不同。若要了解更多信息,请参考《MySQL内部原理:跟踪优化器》。

当你确信应当使用某些索引,但实际上并没有用到这些索引时,你可以运行ANALYZE TABLE语句来更新表的统计信息(例如,键值基数),这些信息可能会影响优化器作出的决策。请参考《ANALYZE TABLE语句的语法》。