explain是用來分析sql語句,幫助優化的一個命令。
explain的語法如下:
explain [extended] select … from … where …
如果使用了extended,那麼在執行完explain語句後,可以使用show warnings語句查詢相應的優化信息。
比如我們執行 select uid from user where uname=’scofield’ order by uid 執行結果會有
+—-+————-+——-+——-+——————-+———+———+——-+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——-+——————-+———+———+——-+——+——-+
這些東西。
其中 table 表示是哪個表的數據。
type比較重要。表示鏈接的類型。鏈接類型由好到壞的,依次是 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般情況,至少要達到 range 級別,最好是 ref 級別。否則可能會有性能問題。
possible_keys 是指可以應用到該表的索引,如果爲NULL則沒有。
key 是指用到的索引。
key_len 是索引的長度,在不影響查詢精度的情況下,值越小越好。
ref 是指索引的那一列被使用了。一般會是個常數。
rows 是指有多少行。
extra 是指額外的信息。也是比較重要的。如果值爲 distinct ,說明mysql 找到了域行聯合匹配的行,就不再查找了。
如果值爲 not exits : mysql優化了 left join ,一旦找到了 left join 匹配的行,便不再進行搜索了。
如果值爲 rang checked for each : 沒有找到理想的索引。
如果爲 using filesort ,則需要改進sql了。這說明 mysql執行 需要 文件排序。這是比較影響效率的。
如果爲 using temporary , 這是使用了 臨時表。 這種情況也比較影響效率,sql需要改進。或者從應用層進行改進。
如果爲 where used 說明使用了where語句。如果 type爲 all 或者 index ,一般會出現這樣的結果。這樣的問題,一般是查詢需要改進。
在一般稍大的系統中,基本儘可能的減少 join ,子查詢 等等。mysql就使用最簡單的查詢,這樣效率最高。至於 join 等,可以放在應用層去解決。