手册上关于EXPLAIN语法的讲解: html
EXPLAIN
SyntaxEXPLAIN [EXTENDED] SELECT select_options
Or:mysql
EXPLAIN tbl_name
The EXPLAIN
statement can be used either as a way to obtain information about how MySQL executes a SELECT
statement or as a synonym for DESCRIBE
:sql
When you precede a SELECT
statement with the keyword EXPLAIN
, MySQL displays information from the optimizer about the query execution plan. That is, MySQL explains how it would process the SELECT
, including information about how tables are joined and in which order. EXPLAIN EXTENDED
can be used to provide additional information.数据库
For information on how to use EXPLAIN
and EXPLAIN EXTENDED
to obtain query execution plan information, see Section 7.2.1, “Optimizing Queries with EXPLAIN
”.ide
EXPLAIN
is synonymous with tbl_name
DESCRIBE
or tbl_name
SHOW COLUMNS FROM
.优化tbl_name
For a description of the DESCRIBE
and SHOW COLUMNS
statements, see Section 12.8.1, “DESCRIBE
Syntax”, and Section 12.4.5.5, “SHOW COLUMNS
Syntax”.spa
-------------------code
如下的文章主要讲述的是MYSQL EXPLAIN语句中的extended 选项的实际应用与具体的操做步骤,咱们你们都了解MySQL数据库中有一个explain 命令,其主要功能是用来分析select语句的运行效果,例如explain能够得到select语句。orm
使用的索引状况、排序的状况等等。除此之外,explain 的extended 扩展可以在本来explain的基础xml
上额外的提供一些查询优化的信息,这些信息能够经过MySQL的show warnings命令获得。下面是一个最简单的例子。
首先执行对想要分析的语句进行MySQL explain,并带上extended选项
- MySQL> explain extended select * from account\G;
- id: 1
- select_type: SIMPLE
- table: account
- type: ALL
- possible_keys: NULL
- key: NULL
- key_len: NULL
- ref: NULL
- rows: 1
- filtered: 100.00
- Extra:
- 1 row in set, 1 warning (0.00 sec)
接下来再执行Show Warnings
- MySQL> show warnings\G;
- Code: 1003
- Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`
- 1 row in set (0.00 sec)
从 show warnings的输出结果中咱们能够看到本来的select * 被MySQL优化成了
- select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name`。
explain extended 除了可以告诉咱们MySQL的查询优化能作什么,同时也能告诉咱们MySQL的查询优化作不了什么。MySQL performance的Extended EXPLAIN这篇文中中做者就利用explain extended +show warnings 找到了MySQL查询优化器中不能查询优化的地方。
从
- EXPLAIN extended SELECT * FROM sbtest WHERE id>5 AND id>6 AND c=”a” AND pad=c
语句的输出咱们得知MySQL的查询优化器不能将id>5 和 id>6 这两个查询条件优化合并成一个 id>6。
在MySQL performance的explain extended文章中第三个例子和静室的MySQL explain的extended选项文章中,
两位做者也对explain extended作了进一步的实验,从这个两篇文中中咱们能够得出结论是从
explain extend的输出中,咱们能够看到sql的执行方式,对于分析sql仍是颇有帮助的。
下面特别摘抄了静室的explain的extended选项这篇文章中的内容
如下代码和分析摘抄至静室的explain的extended选项
- MySQL>explain extended select * from t where a in (select b from i);
- +—-+——————–+——-+——+
- | id | select_type | table | type |
- +—-+——————–+——-+——+
- | 1 | PRIMARY | t | ALL |
- | 2 | DEPENDENT SUBQUERY | i | ALL |
- +—-+——————–+——-+——+
- 2 rows in set, 1 warning (0.01 sec)
子查询看起来和外部的查询没有任何关系,为何MySQL显示的是DEPENDENT SUBQUERY,
和外部相关的查询呢?从explain extended的结果咱们就能够看出缘由了。
- MySQL>show warnings\G
- Level: Note
- Code: 1003
- Message: select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`
- from `test`.`t` where
- <in_optimizer>(`test`.`t`.`a`,
- <exists>(select 1 AS `Not_used` from `test`.`i`
- where (<cache>(`test`.`t`.`a`) = `test`.`i`.`b`)))
- 1 row in set (0.00 sec)
在这里MySQL改写了SQL,作了in的优化。
以上代码和分析摘抄至静室的explain的extended选项
不过须要注意的一点是从EXPLAIN extended + show warnings获得“优化之后”的查询语句
可能还不是最终优化执行的sql,或者说MySQL explain extended看到的信息还不足以说明MySQL最
终对查询语句优化的结果。一样仍是MySQL formance的explain Extended这篇文章的第二个
例子就说明了这种状况
- MySQL> EXPLAIN extended SELECT t1.id,t2.pad FROM sbtest t1, sbtest t2 WHERE t1.id=5
- AND t2.k=t1.k;
- +—-+————-+——-+——-+—————+———+———+——-+——-+——-+
- | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
- +—-+————-+——-+——-+—————+———+———+——-+——-+——-+
- | 1 | SIMPLE | t1 | const | PRIMARY,k | PRIMARY | 4 | const | 1 | |
- | 1 | SIMPLE | t2 | ref | k | k | 4 | const | 55561 | |
- +—-+————-+——-+——-+—————+———+———+——-+——-+——-+
- 2 rows IN SET, 1 warning (0.00 sec)
- MySQL> SHOW warnings \G
1. row Level: Note
- Code: 1003
- Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.`sbtest` `t1`
- JOIN `test`.`sbtest` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5))
- 1 row IN SET (0.00 sec)
从Explain的结果中咱们能够获得t1表的查询使用的是”const”类型,也就是说MySQL查询的时候
会先由t1.id=5 找到t1.k 再利用t1.k的值去t2表中查询数据,很显然这样的查询优化结果没有在
接下来的Show Warings输出中找到。
总结
仍是引用静室 在explain的 extended选项这篇文章中的几句话”从MySQL explain extend的输出中,咱们能够看到sql的执行方式,对于分析sql仍是颇有帮助的”。
转载自: http://database.51cto.com/art/201005/201354.htm