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,表明索引用來讀取數據而非執行查找動作