MySQL EXPLAIN extended

手冊上關於EXPLAIN語法的講解: html

12.8.2. EXPLAIN Syntax

EXPLAIN [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

 -------------------code

如下的文章主要講述的是MYSQL EXPLAIN語句中的extended 選項的實際應用與具體的操做步驟,咱們你們都瞭解MySQL數據庫中有一個explain 命令,其主要功能是用來分析select語句的運行效果,例如explain能夠得到select語句。orm

使用的索引狀況、排序的狀況等等。除此之外,explain 的extended 擴展可以在本來explain的基礎xml

上額外的提供一些查詢優化的信息,這些信息能夠經過MySQL的show warnings命令獲得。下面是一個最簡單的例子。

首先執行對想要分析的語句進行MySQL explain,並帶上extended選項

  
  
  
  
  1. MySQL> explain extended select * from account\G; 

 

  
  
  
  
  1. id: 1  
  2. select_type: SIMPLE  
  3. table: account  
  4. type: ALL  
  5. possible_keys: NULL  
  6. key: NULL  
  7. key_len: NULL  
  8. ref: NULL  
  9. rows: 1  
  10. filtered: 100.00  
  11. Extra:  
  12. 1 row in set, 1 warning (0.00 sec) 

接下來再執行Show Warnings

  
  
  
  
  1. MySQL> show warnings\G; 

 

  
  
  
  
  1. Code: 1003  
  2. Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`  
  3. 1 row in set (0.00 sec) 

從 show warnings的輸出結果中咱們能夠看到本來的select * 被MySQL優化成了

 

  
  
  
  
  1. select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`nameAS `name`。 

explain extended 除了可以告訴咱們MySQL的查詢優化能作什麼,同時也能告訴咱們MySQL的查詢優化作不了什麼。MySQL performance的Extended EXPLAIN這篇文中中做者就利用explain extended +show warnings 找到了MySQL查詢優化器中不能查詢優化的地方。

  
  
  
  
  1. 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選項

  
  
  
  
  1. MySQL>explain extended select * from t where a in (select b from i);  
  2. +—-+——————–+——-+——+  
  3. | id | select_type | table | type |  
  4. +—-+——————–+——-+——+  
  5. | 1 | PRIMARY | t | ALL |  
  6. | 2 | DEPENDENT SUBQUERY | i | ALL |  
  7. +—-+——————–+——-+——+  
  8. 2 rows in set, 1 warning (0.01 sec) 

子查詢看起來和外部的查詢沒有任何關係,爲何MySQL顯示的是DEPENDENT SUBQUERY,

和外部相關的查詢呢?從explain extended的結果咱們就能夠看出緣由了。

  
  
  
  
  1. MySQL>show warnings\G 

 

  
  
  
  
  1. Level: Note  
  2. Code: 1003  
  3. Message: select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`  
  4. from `test`.`t` where  
  5. <in_optimizer>(`test`.`t`.`a`,  
  6. <exists>(select 1 AS `Not_used` from `test`.`i`  
  7. where (<cache>(`test`.`t`.`a`) = `test`.`i`.`b`)))  
  8. 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這篇文章的第二個

例子就說明了這種狀況

  
  
  
  
  1. MySQL> EXPLAIN extended SELECT t1.id,t2.pad FROM sbtest t1, sbtest t2 WHERE t1.id=5 
  2. AND t2.k=t1.k;  
  3. +—-+————-+——-+——-+—————+———+———+——-+——-+——-+  
  4. | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |  
  5. +—-+————-+——-+——-+—————+———+———+——-+——-+——-+  
  6. | 1 | SIMPLE | t1 | const | PRIMARY,k | PRIMARY | 4 | const | 1 | |  
  7. | 1 | SIMPLE | t2 | ref | k | k | 4 | const | 55561 | |  
  8. +—-+————-+——-+——-+—————+———+———+——-+——-+——-+  
  9. 2 rows IN SET, 1 warning (0.00 sec)  
  10. MySQL> SHOW warnings \G  

1. row Level: Note

  
  
  
  
  1. Code: 1003  
  2. Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.`sbtest` `t1`  
  3. JOIN `test`.`sbtest` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5))  
  4. 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

相關文章
相關標籤/搜索