在MySQL中,當數據量增加的特別大的時候就須要用到索引來優化SQL語句,而如何才能判斷咱們辛辛苦苦寫出的SQL語句是否優良?這時候explain就派上了用場。mysql
explain + SQL語句便可 如:explain select * from table;
複製代碼
以下 sql
相信第一次使用explain參數的朋友必定會疑惑這一大堆參數究竟有什麼用呢?筆者蒐集了一些資料,在這兒作一個總結但願可以幫助你們理解。bash
若是是子查詢,id的序號會遞增,id的值越大優先級越高,越先被執行
複製代碼
顯示查詢使用了何種類型
從最好到最差依次是
System>const>eq_ref>range>index>All(**全表掃描**)
通常來講**至少達到range級別,最好達到ref**
System:表只有一行記錄,這是const類型的特例,平時不會出現(忽略不計)
const:表示經過索引一次就找到了,const用於比較primary key或者unique索引,由於只匹配一行數據,因此很快。如將主鍵置於where列表中,MySQL就能將該查詢轉換爲一個常量。
eq_ref:惟一性索引掃描,對於每一個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或惟一索引掃描。
ref:非惟一索引掃描,返回匹配某個單獨值的行,本質上也是一種索引訪問,它返回全部匹配某個單獨值的行,然而它可能會找到多個符合條件的行,因此它應該屬於查找和掃描的混合體
range:只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用了哪一個索引,通常就是在你的where語句中出現了between、<、>、in等的查詢。這種範圍掃描索引比全表掃描要好,由於它只須要開始於索引的某一點,而結束於另外一點,不用掃描所有索引。
index:FULL INDEX SCAN,index與all區別爲index類型只遍歷索引樹。這一般比all快,由於索引文件一般比數據文件小。
複製代碼
包含不適合在其餘列中顯示但十分重要的額外信息 包含的信息: **(危險!)**Using filesort:說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取,MYSQL中沒法利用索引完成的排序操做稱爲「文件排序」 **(特別危險!)**Using temporary:使用了臨時表保存中間結果,MYSQL在對查詢結果排序時使用臨時表。常見於排序order by 和分組查詢 group by Using index:表示相應的select操做中使用了覆蓋索引,避免訪問了表的數據行,效率不錯。若是同時出現using where,代表索引被用來執行索引鍵值的查找;若是沒有同時出現using where,代表索引用來讀取數據而非執行查找操做。優化
顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出, 但不必定被查詢實際使用spa
實際使用的索引,若是爲NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引僅出如今key列表中,key參數能夠做爲使用了索引的判斷標準code
:表示索引中使用的字節數,可經過該列計算查詢中索引的長度,在不損失精確性的狀況下,長度越短越好,key_len顯示的值爲索引字段的最大可能長度,並不是實際使用長度,即key_len是根據表定義計算而得,不是經過表內檢索出的。cdn
顯示索引的哪一列被使用了,若是可能的話,是一個常數。哪些列或常量被用於查找索引上的值。blog
根據表統計信息及索引選用狀況,大體估算出找到所需記錄所須要讀取的行數排序