EXPLIAN-修訂版

查詢優化必備神器—EXPLAIN

學習解釋EXPLAIN將幫助你瞭解MySQL優化器是如何工作的。要使用EXPLAIN,只需要在查詢的SELECT關鍵字之前加上EXPLIAN這個詞,MySQL會在查詢上設置一個標誌。當執行一個查詢時,這個標誌會使其返回在執行計劃中每一步的信息,而不是執行它。增加EXPLAIN時在查詢在FROM子句中包括子查詢的情況下,會執行子查詢。

EXPLAIN中的列總是10個列,分別是id、 select_type、 table、 type、 possible_keys、 key、key_len、 ref、 rows、 Extra,只有EXPLAIN EXTENDED在MySQL5.1增加了一個filtered列,EXPLAIN PARTITIONS 增加了一個Partitions列)。

使用EXPLAIN解析SQL執行計劃時,如果有下面幾種情況,就需要特別關注下了:

  • 首先看下 type 這列的結果,如果有類型是 ALL 時,表示預計會進行全表掃描(full table scan)。通常全表掃描的代價是比較大的,建議創建適當的索引,通過索引檢索避免全表掃描。

  • 再來看下 Extra 列的結果,如果有出現 Using temporary 或者 Using filesort 則要多加關注:

    • Using temporary,表示需要創建臨時表以滿足需求,通常是因爲GROUP BY的列沒有索引,或者GROUP BY和ORDER BY的列不一樣,也需要創建臨時表,建議添加適當的索引。
    • Using filesort,表示無法利用索引完成排序,也有可能是因爲多表連接時,排序字段不是驅動表中的字段,因此也沒辦法利用索引完成排序,建議添加適當的索引。
    • Using where,通常是因爲全表掃描或全索引掃描時(type 列顯示爲 ALL 或 index),又加上了WHERE條件,建議添加適當的索引。
    • 其他狀態例如:Using index、Using index condition、Using index for group-by 則都還好,不用緊張。

Select_type列

這一列顯示了對應行是簡單還是複雜SELECT。如果是簡單查詢,則顯示SIMPLE值,如果是複雜的查詢,最外層部分均標記爲PAIMARY。接下來根據複雜查詢的種類,簡單子查詢顯示SUBQUERY,如果是派生表顯示DERIVED,如果是UNION查詢顯示UNION。

MySQL把SELECT查詢分爲簡單和複雜查詢,複雜類型可分爲三類:簡單子查詢、所謂的派生表、以及UNION查詢。上面的那條查詢語句就是簡單子查詢,FROM子句中的子查詢就是所謂的派生表。

table列

這一列顯示了對應行在訪問哪一個表。可以在這一列中從上往下觀察MySQL的關聯優化器爲查詢選擇的關聯順序。

Type列

表示訪問類型,就是MySQL決定如何查找表中的行,下面的訪問方法依次從最差到最優。

  • ALL
    最差的方法,利用全表掃描
  • Index
    這個跟全表掃描一樣,只是MySQL掃描表時按索引次序進行而不是行。他的主要優點是避免了排序。最大的缺點是要承擔按索引次序讀取整張表的開銷。意味着隨機次序訪問行,開銷很大。如果在Extra列中看到“Using index”,說明使用的是覆蓋索引。
  • Range
    範圍掃描就是一個有限制的索引掃描,開始於索引裏的某一點,返回匹配這個值域的行。比全索引掃描好一點,不用遍歷全部索引,當MySQL使用索引去查找一系列的值時,例如IN()和OR列表,也會顯示爲範圍查詢。
  • Ref
    這是一種索引訪問,返回所有匹配某個單個值的行,它是查找和掃描的混合體,此類索引訪問只有當使用了非唯一性索引或者唯一性索引的非唯一性前綴纔會發生。
  • eq_ref
    使用這種索引查找,MySQL知道最多會只會返回一條符合條件的記錄。這種訪問方法只會在MySQL使用主鍵或者唯一性索引查找纔會看到。
  • Const,system
    當MySQL能夠對查詢的某一部分進行優化並將其轉換爲一個常量時,就會使用這些訪問類型。

Key列

這一列顯示了MySQL決定使用哪個索引來優化對錶的訪問,如果該索引沒有出現在possible_key列中,說明MySQL選擇了覆蓋索引

Extra列

這一列包含的是不適合顯示在其他列的額外信息。

Using index使用覆蓋索引。

Using filesort代表在進行關聯查詢時用到了文件排序,並且ORDER BY子句中的所有的列都來自關聯的第一個表,MySQL在關聯處理第一個表的時候就進行文件排序。

Using temporary;Using filesort代表會將關聯的結果先存放在一個臨時表中,等到所有的關聯都結束時,再進行文件排序。

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