原文链接:http://dev.mysql.com/doc/refman/5.7/en/explain.html
一、语法
1. 语法格式-1
{EXPLAIN | DESCRIBE | DESC}
tbl_name [col_name | wild]
2. 语法格式-2
{EXPLAIN | DESCRIBE | DESC}
[explain_type]
{explainable_stmt | FOR CONNECTION connection_id}
3. 选项取值
-
explain_type的可能取值:
explain_type: {
EXTENDED
| PARTITIONS
| FORMAT = format_name
}
-
format_name的可能取值:
format_name: {
TRADITIONAL
| JSON
}
-
explainable_stmt的可能取值:
explainable_stmt: {
SELECT statement
| DELETE statement
| INSERT statement
| REPLACE statement
| UPDATE statement
}
DESCRIBE
和EXPLAIN
是同义词。实际上,DESCRIBE
关键字更常用于获取表结构的相关信息,而EXPLAIN
关键字则用于获取一个查询语句的执行计划(也就是说,解释MySQL如何执行一条查询语句)。下面的讨论将会按照上述的用法使用DESCRIBE
和EXPLAIN
关键字,但是MySQL解析器会将这两个关键字完全当做同义词来处理。
二、获取表结构信息
DESCRIBE
关键字可以提供一张表中列的相关信息。
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
语句的描述能够提供更多关于输出列的信息。请参考《SHOW COLUMNS语句的语法》。
默认情况下,DESCRIBE
关键字会显示表中所有列的相关信息。col_name(如果给定)是表中某列的名称。在这种情况下,这条语句只会显示col_name指定的列的相关信息。wild(如果给定)是一个模式字符串。它可以包含SQL的“%”和“_”通配符。在这种情况下,这条语句只会显示列名匹配wild指定的模式字符串的列的相关信息。除非字符串包含空格或其他特殊字符,否则不需要将这个字符串放在封闭的引号之内。
DESCRIBE
语句还兼容于Oracle数据库。
SHOW CREATE TABLE
、SHOW TABLE STATUS
和SHOW INDEX
语句也会提供表相关的信息。请参考《SHOW语句的语法》。
三、获取执行计划信息
EXPLAIN
语句可以提供MySQL如何执行语句的相关信息:
-
在MySQL的5.7版本中,适用于
EXPLAIN
的可解释语句包括SELECT
、DELETE
、INSERT
、REPLACE
和UPDATE
。 -
当对一条可解释语句使用
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语句的语法》。