MySQL 的explain命令有一個extended選項,我想可以很多人都沒有注意,因為它對命令的輸出結果沒有任何改變,只是增加了一個warning。這個 warning中顯示了MySQL對SQL的解釋,從這個解釋中我們可以看到SQL的執行方式,對於分析SQL還是很有用的。也即explain 的extended 擴展能夠在原本explain的基礎上額外的提供一些查詢優化的信息,這些信息可以通過mysql的show warnings命令得到。下面是一個最簡單的例子。
首先執行對想要分析的語句進行explain,並帶上extended選項
mysql> explain extended select count(*) from test1,test2 where test1.id=test2.id and test2.email='duan@qq.com';
接下來再執行Show Warnings
mysql> show warnings\G;
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> explain extended select * from test1 where id in (select id from test2);
上面是一個子查詢看起來和外部的查詢沒有任何關系,從explain extended的結果我們就可以看看mysql如何優化的:
不過需要注意的一點是從EXPLAIN extended +show warnings得到“優化以后”的查詢語句可能還不是最終優化執行的sql,或者說explain extended看到的信息還不足以說明mysql最終對查詢語句優化的結果。
相關資源
mysql performance的 explain extended
靜室的explain extended選項
mysql 參考手冊中的EXPLAIN語法(獲取SELECT相關信息)