{EXPLAIN | DESCRIBE | DESC}
tbl_name [col_name | wild]
{EXPLAIN | DESCRIBE | DESC}
[explain_type]
{explainable_stmt | FOR CONNECTION connection_id}
{EXPLAIN | DESCRIBE | DESC} ANALYZE select_statement
explain_type: {
FORMAT = format_name
}
format_name: {
TRADITIONAL
| JSON
| TREE
}
explainable_stmt: {
SELECT statement
| TABLE statement
| DELETE statement
| INSERT statement
| REPLACE statement
| UPDATE statement
}
DESCRIBE和 EXPLAIN语句是同义词。实际上,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提供了有关输出列的更多信息。请参见 第13.7.7.5节“ SHOW COLUMNS语句”。
默认情况下,DESCRIBE显示有关表中所有列的信息。 colname(如果给出)是表中列的名称。在这种情况下,该语句仅显示有关命名列的信息。 wild(如果给出)是模式字符串。它可以包含SQL %和通配符。在这种情况下,该语句仅显示名称与字符串匹配的列的输出。除非字符串包含空格或其他特殊字符,否则无需将其用引号引起来。
DESCRIBE提供 该语句是为了与Oracle兼容。
的SHOW CREATE TABLE, SHOW TABLE STATUS和 SHOW INDEX语句也可以提供有关表的信息。请参见第13.7.7节“ SHOW语句”。
获取执行计划信息
该EXPLAIN语句提供有关MySQL如何执行语句的信息:
EXPLAIN作品有 SELECT, DELETE, INSERT, REPLACE,和 UPDATE语句。在MySQL 8.0.19和更高版本中,它也可用于 TABLE语句。
当EXPLAIN与可解释的语句一起使用时,MySQL将显示来自优化器的有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理该语句,包括有关如何连接表以及以何种顺序连接表的信息。有关 EXPLAIN用于获取执行计划信息的信息,请参见第8.8.2节“ EXPLAIN输出格式”。
当EXPLAIN与FOR CONNECTION CONNECTION\u id一起使用而不是可解释的语句时,它将显示在命名连接中执行的语句的执行计划。
对于可解释的语句, EXPLAIN生成可以使用来显示的其他执行计划信息 SHOW WARNINGS。
EXPLAIN对于检查涉及分区表的查询很有用。
该FORMAT选项可用于选择输出格式。TRADITIONAL以表格格式显示输出。如果不FORMAT存在任何选项,则为默认设置 。 JSONformat以JSON格式显示信息。在MySQL 8.0.16和更高版本中, TREE提供了类似于TRADITIONAL格式的树状输出,其中对查询处理的描述更为精确 。它是唯一显示哈希联接用法的格式(请参见 第8.2.1.4节“哈希联接优化”),并且始终用于 EXPLAIN ANALYZE。
EXPLAIN需要对所 SELECT访问的任何表或视图(包括视图的任何基础表)具有特权。对于视图,EXPLAIN还需要 SHOW VIEW特权。 如果指定的连接属于其他用户,则EXPLAIN ... FOR CONNECTION还需要 PROCESS特权。
在的帮助下EXPLAIN,您可以看到应该在表中添加索引的位置,以便通过使用索引查找行来使语句更快地执行。您还可以 EXPLAIN用来检查优化器是否以最佳顺序联接表。要提示优化器使用连接顺序,该连接顺序与SELECT语句中表的命名顺序相对应,请以 SELECT STRAIGHT_JOIN而不是just 开头SELECT。
优化程序跟踪有时可能提供与补充的信息EXPLAIN。但是,优化程序的跟踪格式和内容在版本之间可能会发生变化。有关详细信息,请参见 MySQL内部:跟踪优化器。
如果您在认为应该使用索引时遇到问题,请运行ANALYZE TABLE以更新表统计信息,例如键的基数,这可能会影响优化器的选择。