1. DESCRIBE语句
DESCRIBE和EXPLAIN是同义词,被用来获取表结构或者查询执行计划的信息。更多信息,可以参考SHOW COLUMNS语句和EXPLAIN语句。
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
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的缩写。这些语句也展示视图的信息。
默认情况下,DESCRIBE展示表中所有列的信息。如果给定了列名,就只展示给定列的信息。列名也可以含有通配符%。
mysql> DESCRIBE City `%c%`
SHOW CREATE TABLE, SHOW TABLE STATUS 和 SHOW INDEX 语句也提供表的信息。
获取执行计划信息
EXPLAIN语句提供MySQL如何执行语句的信息:
EXPLAIN和SELECT, DELETE , INSERT, REPLACE, UPDATED语句一起使用。
当EXPLAIN和一个可以执行的语句一起使用时,MySQL展示来自优化器关于语句执行计划的信息。就是说,MySQL解释如果处理语句,包括表如何连接,以及怎么排序。更多关于EXPLAIN的输出查询计划的信息,参考EXPLAIN Output Format。
当EXPLAIN和FOR CONNECTION connection_id使用,而不是一个可执行的语句时,它展示在指定链接中的语句执行计划。参考Obtaining Execution Plan Information for a Named Connection。
对于SELECT语句,EXPLAIN生成可以额外的执行计划信息,就是可以用SHOW WARNINGS展示的信息。参考Extended EXPLAIN Output Format。
EXPLAIN对检查查询涉及的分区表有用
FORMAT选项可以被用来选择输出格式。TRADITIONAL表示用表的格式输出。如果没有FORMAT选项,这是默认的。JSON格式就是用JSON格式显示。
mysql> desc FORMAT=JSON select count(1) from factory_info;
EXPLAIN要求有任意访问的表或者视图的SELECT权限,包括视图底层的表。对于视图,EXPLAIN也要求SHOW VIEW权限。
有了EXPLAIN的帮助,你可以看见哪里应该加索引以便语句执行更快。你可以可以用EXPLAIN检查优化器是否以更好的顺序链接表。为了提示优化器的SELECT语句按指定顺序连接表,在语句的开头可以使用SELECT STRAIGHT_JOIN而不是SELECT。
优化器追踪有时提供的信息与EXPLAIN的互补。然而,优化器追踪格式和内容随着版本变化而变化。更多细节,参考MySQL Internals: Tracing the Optimizer.
如果你怀疑索引使用的有问题,可以运行ANALYZE TABLE来更新表统计信息,例如索引的基数,这会影响优化器做出的选择。参考ANALYZE TABLE Statement。