MySQL的EXPLAIN命令用法

explain顯示了mysql如何處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。
先解析一條sql語句,看出現什麼內容




好,接下來咱們就看看出現的這幾行所代表的含義!
1、id
SELECT識別符,這是SELECT查詢序列號。這個不重要,查詢序號即爲sql語句執行的順序


2、select_type
select類型,它有以下幾種值:
simple:它表示簡單的select,沒有union和子查詢
primary:最外面的select,在有子查詢的語句中,最外面的select查詢就是primary
union:union語句的第二個及以後的子查詢
dependent union:UNION中的第二個及以後的子查詢語句,取決於外面的查詢
union result:UNION的結果
subquery:子查詢中的第一個select語句
dependent subquery:依賴於外查詢的子查詢中的第一個select
derived:子查詢衍生出來的表
materialized:物化子查詢
uncacheable subquery:不能被緩存,需要重新評估的子查詢
uncacheable union:union中第二個及以上的uncacheable subquery中需要重新評估的子查詢


3、table
輸出的行所用的表


4、type
連接類型
system:表僅有一行,這是const類型的特列,平時不會出現,這個也可以忽略不計
const:表最多有一個匹配行,const用於比較primary key 或者unique索引。因爲只匹配一行數據,所以很快。記住一定是用到primary key或者unique,並且只檢索出兩條數據的情況下才會是const
eq_ref:對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接類型,除了const類型。它用在一個索引的所有部分被聯接使用並且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用於使用=比較帶索引的列。
ref:對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的前綴,或如果鍵不是UNIQUE或PRIMARY KEY(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接類型是不錯的。
fulltext:使用全文索引
ref_or_null:該聯接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經常使用該聯接類型的優化。
index_merge:該聯接類型表示使用了索引合併優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
unique_subquery:在帶有in的子句中用來代替ref
index_subquery:類似於unique_subquery,查詢條件
range:給定範圍內的檢索,使用一個索引來檢查行,用到=、<>、>、<、>=、<=、is null、<=>、between、in
ALL:對於每個來自於先前的表的行組合,進行完整的表掃描。如果表是第一個沒標記const的表,這通常不好,並且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基於前面的表中的常數值或列值被檢索出。
index:該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因爲索引文件通常比數據文件小。(也就是說雖然all和Index都是讀全表,但index是從索引中讀取的,而all是從硬盤中讀的)


5、possible_keys
提示使用哪個索引會在該表中找到行


6、keys
查詢實際用到的索引


7、key_len
實際用到的索引長度


8、ref
ref列顯示使用哪個列或常數與key一起從表中選擇行。


9、rows
顯示執行查詢的行數,,數值越大越不好,說明沒有用好索引


10、Extra
查詢語句的額外信息


我們再使用explain查看SQL執行計劃是,要着重注意以下幾點:
1、type
如果類型是all,則表示走的全表掃描,這個代價很大,建議創建適當的索引或者使用帶有索引的字段作爲查詢條件
此外,全索引掃描(full index scan)的代價有時候是比全表掃描還要高的,除非是基於InnoDB表的主鍵索引掃描。


2、Extra
Using temporary,表示需要創建臨時表,通常是因爲GROUP BY的列沒有索引,或者GROUP BY和ORDER BY的列不一樣,也需要創建臨時表,建議添加適當的索引。
Using filesort,表示無法利用索引完成排序,也有可能是因爲多表連接時,排序字段不是驅動表中的字段,因此也沒辦法利用索引完成排序,建議添加適當的索引。
Using where,通常是因爲全表掃描或全索引掃描時(type 列顯示爲 ALL 或 index),又加上了WHERE條件,建議添加適當的索引。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章