淺析MySQL語句優化中的explain參數

有什麼用?

在MySQL中,當數據量增加的特別大的時候就須要用到索引來優化SQL語句,而如何才能判斷咱們辛辛苦苦寫出的SQL語句是否優良?這時候explain就派上了用場。mysql

怎麼使用?

explain + SQL語句便可 如:explain select * from table;
複製代碼

以下 sql

explain參數

相信第一次使用explain參數的朋友必定會疑惑這一大堆參數究竟有什麼用呢?筆者蒐集了一些資料,在這兒作一個總結但願可以幫助你們理解。bash


參數介紹

id

若是是子查詢,id的序號會遞增,id的值越大優先級越高,越先被執行
複製代碼

select_type

查詢的類型,主要用於區別普通查詢、聯合查詢、子查詢等的複雜查詢 SIMPLE:簡單的select查詢,查詢中不包含子查詢或者UNION PRIMARY:查詢中若包含任何複雜的子部分,最外層查詢則被標記爲PRIMARY(最後加載的那一個 ) SUBQUERY:在SELECT或WHERE列表中包含了子查詢 DERIVED:在FROM列表中包含的子查詢被標記爲DERIVED(衍生)Mysql會遞歸執行這些子查詢,把結果放在臨時表裏。 UNION:若第二個SELECT出如今UNION以後,則被標記爲UNION;若UNION包含在FROM字句的查詢中,外層SELECT將被標記爲:DERIVED UNION RESULT:從UNION表獲取結果的SELECT type

顯示查詢使用了何種類型
	從最好到最差依次是
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快,由於索引文件一般比數據文件小。
複製代碼

extra

包含不適合在其餘列中顯示但十分重要的額外信息 包含的信息: **(危險!)**Using filesort:說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取,MYSQL中沒法利用索引完成的排序操做稱爲「文件排序」 **(特別危險!)**Using temporary:使用了臨時表保存中間結果,MYSQL在對查詢結果排序時使用臨時表。常見於排序order by 和分組查詢 group by Using index:表示相應的select操做中使用了覆蓋索引,避免訪問了表的數據行,效率不錯。若是同時出現using where,代表索引被用來執行索引鍵值的查找;若是沒有同時出現using where,代表索引用來讀取數據而非執行查找操做。優化

possible_keys

顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出, 但不必定被查詢實際使用spa

key

實際使用的索引,若是爲NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引僅出如今key列表中,key參數能夠做爲使用了索引的判斷標準code

key_len

:表示索引中使用的字節數,可經過該列計算查詢中索引的長度,在不損失精確性的狀況下,長度越短越好,key_len顯示的值爲索引字段的最大可能長度,並不是實際使用長度,即key_len是根據表定義計算而得,不是經過表內檢索出的。cdn

ref

顯示索引的哪一列被使用了,若是可能的話,是一個常數。哪些列或常量被用於查找索引上的值。blog

rows

根據表統計信息及索引選用狀況,大體估算出找到所需記錄所須要讀取的行數排序

相關文章
相關標籤/搜索