mysql 的 explain 的相關 欄位的介紹
阿新 • • 發佈:2018-12-14
參考部落格並整理如下:
連結: (https://www.cnblogs.com/xuanzhi201111/p/4175635.html).
連結: (https://www.cnblogs.com/0201zcr/p/5742382.html).
expain出來的資訊有10列,分別是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面對這些欄位出現的可能進行解釋:
id
select識別符。這個是select查詢序列號。這個不重要,查詢序號即為sql語句執行的順序。
select_type
- SIMPLE (簡單SELECT,不使用UNION或子查詢等)
- PRIMARY (查詢中若包含任何複雜的子部分,最外層的select被標記為PRIMARY)
- UNION (UNION中的第二個或後面的SELECT語句)
- DEPENDENT UNION (UNION中的第二個或後面的SELECT語句,取決於外面的查詢)
- UNION RESULT (UNION的結果)
- SUBQUERY (子查詢中的第一個SELECT)
- DEPENDENT SUBQUERY (子查詢中的第一個SELECT,取決於外面的查詢)
- DERIVED (派生表的SELECT, FROM子句的子查詢)
- UNCACHEABLE SUBQUERY (一個子查詢的結果不能被快取,必須重新評估外連結的第一行)
table
輸出的行用到的資料的表
type
表示MySQL在表中找到所需行的方式,又稱“訪問型別”。
常用的型別有: ALL, index, range, ref, eq_ref, const, system, NULL(從左到右,效能從差到好)
- ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行
- index: Full Index Scan,index與ALL區別為index型別只遍歷索引樹
- range:只檢索給定範圍的行,使用一個索引來選擇行
- ref: 表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值
- eq_ref: 類似ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連線中使用primary key或者 unique key作為關聯條件
- const、system: 當MySQL對查詢某部分進行優化,並轉換為一個常量時,使用這些型別訪問。如將主鍵置於where列表中,MySQL就能將該查詢轉換為一個常量,system是const型別的特例,當查詢的表只有一行的情況下,使用system
- NULL: MySQL在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從一個索引列裡選取最小值可以通過單獨索引查詢完成。
possible_keys
顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從where語句中選擇一個合適的語句
Key
實際使用的索引。如果沒有選擇索引,鍵是NULL。要想強制MySQL使用或忽視possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
使用的索引的長度。在不損失精確性的情況下,長度越短越好
ref
顯示索引的哪一列被使用了,如果可能的話,是一個常數
rows
表示MySQL根據表統計資訊及索引選用情況,估算的找到所需的記錄所需要讀取的行數。數值越大越不好,說明沒有用好索引
Extra
- distinct : 一旦mysql找到了與行相聯合匹配的行,就不再搜尋了
- not exists : mysql優化了left join,一旦它找到了匹配left join標準的行,就不再搜尋了
- range checked for each record(index map:#): 沒有找到理想的索引,因此對於從前面表中來的每一個行組合,mysql檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連線之一
- using filesort : 看到這個的時候,查詢就需要優化了。mysql需要進行額外的步驟來發現如何對返回的行排序。它根據連線型別以及儲存排序鍵值和匹配條件的全部行的行指標來排序全部行
- using index: 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同一個索引的部分的時候
- using temporary 看到這個的時候,查詢需要優化了。這裡,mysql需要建立一個臨時表來儲存結果,這通常發生在對不同的列集進行order by上,而不是group by上
- where used 使用了where從句來限制哪些行將與下一張表匹配或者是返回給使用者。如果不想返回表中的全部行,並且連線型別all或index,這就會發生,或者是查詢有問題不同連線型別的解釋(按照效率高低的順序排序)
- system 表只有一行:system表。這是const連線型別的特殊情況
- const:表中的一個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為mysql先讀這個值然後把它當做常數來對待
- eq_ref:在連線中,mysql在查詢時,從前面的表中,對每一個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用
- ref:這個連線型別只有在查詢使用了不是惟一或主鍵的鍵或者是這些型別的部分(比如,利用最左邊字首)時發生。對於之前的表的每一個行聯合,全部記錄都將從表中讀出。這個型別嚴重依賴於根據索引匹配的記錄多少—越少越好
- range:這個連線型別使用索引返回一個範圍中的行,比如使用>或<查詢東西時發生的情況
index: 這個連線型別對前面的表中的每一個記錄聯合進行完全掃描(比all更好,因為索引一般小於表資料) - all:這個連線型別對於前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,應該儘量避免