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

尋箏發表於2019-03-03

有什麼用?

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

怎麼使用?

explain + SQL語句即可 如:explain select * from table;
複製程式碼

如下

explain引數

相信第一次使用explain引數的朋友一定會疑惑這一大堆引數究竟有什麼用呢?筆者蒐集了一些資料,在這兒做一個總結希望能夠幫助大家理解。


引數介紹

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

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

key

實際使用的索引,如果為NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引僅出現在key列表中,key引數可以作為使用了索引的判斷標準

key_len

:表示索引中使用的位元組數,可通過該列計算查詢中索引的長度,在不損失精確性的情況下,長度越短越好,key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的。

ref

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

rows

根據表統計資訊及索引選用情況,大致估算出找到所需記錄所需要讀取的行數

相關文章