手冊上關於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