MySQL(六):EXPLAIN模擬優化器執行SQL查詢語句

explain 執行後結果分析

 

EXPLAIN SELECT
	s.SETID,
	s.DOBJECTCLASS,
	f.FIELDID,
	f.DCONTROLID,
	f.DSUBCONTROLNAME,
	f.VARNKEY,
	c.COLUMNID,
	c.VARNKEY RELVARNKEY,
	c.CONSTVALUE
FROM
	t_neris_filetran_set s
LEFT JOIN t_neris_filetran_field f ON s.SETID = f.SETID
LEFT JOIN t_neris_filetran_column c ON f.FIELDID = c.FIELDID 
WHERE
	s.SETID = 1 AND c.COLUMNID IS NOT NULL

一:id

select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序。

 

二:select_type

select語句的查詢類型,主要是用於區分普通查詢、聯合查詢、子查詢等複雜查詢。有六種情況:

SIMPlE:簡單select查詢,查詢中不包含子查詢或者UNION。

PRIMARY:查詢中若包含任何複雜的子部分,最外層查詢則被標記爲此值。

SUBQUERY:在select或者where列表中包含了子查詢

DERIVERD:在FROM列表中包含的子查詢被標記爲DERIVED(衍生)。MySQL會遞歸執行這些子查詢,把結果放在臨時表裏。

UNION:若第二個SELECT出現在UNION之後,則被標記爲UNION;若UNION包含在FROM子句的子查詢中,外層SELECT將被標記爲DERIVERD。

UNION RESULT:從UNION表中獲取結果的SELECT。

 

三:table

顯示是那張數據表

 

四:type

顯示查詢使用了何種類型,從最好到最差依次是:system>const>eq_ref>ref>rang>index>all。

system:表中只有一條記錄(等於系統表),這是const類型的特列,平時不會出現。

const:表示通過索引一次就找到了,const用於比較primary key或者unique索引。因爲只匹配一行數據,所以很快。如果主鍵置於where列表中,mysql就能將該查詢轉換爲一個常量。

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

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

rang:只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引(一般就是在where語句中出現了between、<、>、in等查詢)。這種範圍索引掃描比全表掃描要好,因爲它只需要開始於索引的某一點,而結束於另一點,不用掃描全部索引。

index:Full Index San,index與all區別爲index類型只遍歷索引樹。這通常比all快,因爲索引文件通常比數據文件小。(也就是說雖然all和index都是讀取全表,但index是從索引中讀取的,而all是從硬盤中讀的)

all:Full Table San,將遍歷全表以找到匹配的行。

 

注:一般來說,保證查詢至少達到rang級別,最好能達到ref。

 

五:extra

包含不適合在其他列中顯示的額外信息。

using filesort:說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。MySql中無法利用索引完成的排序操作稱爲“文件排序”。避免這種情況。

using temporary:使用了臨時表保存中間結果,MySql在對查詢結果排序時使用臨時表。常見於排序查詢order by和分組查詢group by。避免這種情況。

using index:表示相應的select操作中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率不錯。如果同時出現using where,表示索引被用來執行索引鍵值得查找;如果沒有同時出現using where,表明索引用來讀取數據而非執行查找動作。

using where:表明使用了where過濾。

using join buffer:使用了連接緩存。

impossible where:where子句的值總是false,不能用來獲取任何元組。

distinct:優化distinct操作,在找到第一個匹配的元組後即停止找同樣值得動作。

 

六:其他信息

possible_keys

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

key

實際使用的索引。如果爲NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊。

覆蓋索引:查詢的字段剛好與索引符合,就是SELECT的數據列只用從索引中就能取得,不必讀取數據行。

key_len

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

ref

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

rows

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

你們的老婆來了!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章