mysql Explain

explain + sql語句:

得到表單:


一,id

在表單中,如果id相同從上往下順序執行,id不同 ,id值越大,優先級越高,越先執行


二,select_type

(1) SIMPLE(簡單SELECT,不使用UNION或子查詢等)

(2) PRIMARY(查詢中若包含任何複雜的子部分,最外層的select被標記爲PRIMARY)

(3) UNION(UNION中的第二個或後面的SELECT語句)

(4) DEPENDENT UNION(UNION中的第二個或後面的SELECT語句,取決於外面的查詢)

(5) UNION RESULT(UNION的結果)

(6) SUBQUERY(子查詢中的第一個SELECT)

(7) DEPENDENT SUBQUERY(子查詢中的第一個SELECT,取決於外面的查詢)

(8) DERIVED(派生表的SELECT, FROM子句的子查詢的衍生)

(9) UNCACHEABLE SUBQUERY(一個子查詢的結果不能被緩存,必須重新評估外鏈接的第一行)


三、table

顯示這一行的數據是關於哪張表的,有時不是真實的表名字,看到的是derivedx(x是個數字,我的理解是第幾步執行的結果)


四,type

訪問類型排序,顯示查詢使用了那種類型

從最好到最差依此是:

system>const>eq_ref>ref>range>index>ALL

system

這是const聯接類型的一個特例。表僅有一行滿足條件.

const

表示通過索引一次就找到了,const用於比較primary key或者unique索引,因爲至匹配一行數據,索引很快

比如主鍵置於where列表中,mysql就能將該查詢轉換爲一個常量

er_ref

唯一性索引掃描,對應每個索引鍵,表中只有一條記錄與之匹配,常見於主鍵或唯一索引掃描

ref

非唯一性索引掃描,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,他返回所有匹配某個單獨值的行,然而,他可能會找到多個符合條件的行,索引她應該屬於查找和掃描的混合體

range

只檢索給定範圍的行,使用一個索引來選擇行,key列顯示使用了哪個索引,一般就是基於 between < > in等查詢

index

全表掃描,index和all區別爲index類型只遍歷索引數,通常比all快,因爲索引文件通常比數據文件小

all

全表掃描

五,possible_keys

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

六,key

實際使用的索引,如果爲null,則沒有使用索引,查詢中弱若使用了覆蓋索引,則該索引僅出現在key列表中

七,key_len

key_len顯示的值爲索引字段的最大可能長度,並非實際使用長度,不損失精確性的情況下,長度越短越好

八,ref

顯示索引的哪一列被使用了,如果可能的話,是一個常數

九,rows

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

十,extra

1,using filesort

 說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取,mysql中無法利用索引完成的排序操作稱爲

文件排序

2,using temporary

 使用了臨時表保存中間結果,MYSQL在對查詢結果排序時使用臨時表,常見於排序order by和分組查詢group by

ps:在使用group by時 切記要符合索引 避免產生中間表,增大消耗

3,using index

 表示相應的select操作中使用了覆蓋索引,避免訪問了表的數據行,如果同時出現usinng where ,表明索引被用來執行索引鍵值

的查找,如果沒有同時出現using where,表明索引用來讀取數據而非執行查找動作


發佈了54 篇原創文章 · 獲贊 3 · 訪問量 8432
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章