您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關MySQL中explain字段的作用是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Explain命令是查看查詢優化器是如何決定執行查詢的主要方法。這個功能有局限性,并不總會說出真相,但它的輸出是可以獲取的最好信息,值得花時間去了解,因為可以學習到查詢是如何執行的。學會解釋explain將會幫助你了解MySQL優化器是如何工作的。
在執行Explain時MySQL不會執行查詢,這是一個誤區。事實上查詢中包括子查詢,那么MySQL實際上會執行子查詢,將其結果放在一個臨時表中,然后完成外層的查詢優化。
雖然我們調用explain可以分析sql語句,但要意識到分析出來的結果也是一個近似結果,別無其他。
explain不會告訴你觸發器,存儲過程如何影響查詢
他不會告訴你mysql在查詢執行中所做的特定優化
他不會顯示關于查詢的執行計劃的所有信息
他并不區分具有相同名字的事物。例如,他對內存排序和臨時文件都使用filesort,并且對于磁盤上和內存中的臨時表都顯示using temporary
可能會誤導。例如,他會對一個有著很小limit的查詢顯示全索引掃描
這一列總是包含一個編號,標識select所屬的行。如果在語句當中沒有子查詢活聯合查詢,那么就只會有唯一的select,于是每一行在這個列中都將顯示一個1。否則,內層的select語句一般會順序編號,對應于其在原始語句的位置
這一列顯示了sql語句是簡單的查詢還是復雜的查詢。
簡單查詢顯示的simple,如果有子查詢或者聯合查詢則是primary
SUBQUERY
包含在SELECT列表中的子查詢中的SELECT(換句話說,不 在FROM子句中)標記為SUBQUERY。
DERIVED
DERIVED值用來表示包含在FROM子句的子查詢中的SELECT, MySQL會遞歸執行并將結果放到一個臨時表中。服務器內部稱 其“派生表”,因為該臨時表是從子查詢中派生來的。
UNION
在UNION中的第二個和隨后的SELECT被標記為UNION。第一 個SELECT被標記就好像它以部分外查詢來執行。這就是之前的例子 中在UNION中的第一個SELECT顯示為PRIMARY的原因。如果UNION被 FROM子句中的子查詢包含,那么它的第一個SELECT會被標記 為DERIVED。
UNION RESULT
用來從UNION的匿名臨時表檢索結果的SELECT被標記為UNION RESULT。
除了這些值,SUBQUERY和UNION還可以被標記為DEPENDENT和 UNCACHEABLE。DEPENDENT意味著SELECT依賴于外層查詢中發現的數 據;UNCACHEABLE意味著SELECT中的某些特性阻止結果被緩存于一 個Item_cache中。(Item_cache未被文檔記載;它與查詢緩存不是一回 事,盡管它可以被一些相同類型的構件否定,例如RAND()函數。)
顯示這一步所訪問的數據庫中的表的名稱。
這是最重要的字段之一,顯示查詢使用了何種類型。從最好到最差的連接類型依次為:
system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL
system
系統表,表中只有一行數據
const
讀常量,最多只會有一條記錄匹配,由于是常量,實際上只需要讀一次。
eq_ref
最多只會有一條匹配結果,一般是通過主鍵或唯一鍵索引來訪問
ref
對于來自前面表的每一行,在此表的索引中可以匹配到多行。若聯接只用到索引的最左前綴或索引不是主鍵或唯一索引時,使用ref類型(也就是說,此聯接能夠匹配多行記錄)。
ref可用于使用'='或'<=>'操作符作比較的索引列。
fulltext
使用全文索引的時候是這個類型。要注意,全文索引的優先級很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引
ref_or_null
跟ref類型類似,只是增加了null值的比較。實際用的不多。
eg.
SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL;
index_merge
表示查詢使用了兩個以上的索引,最后取交集或者并集,常見and ,or的條件使用了不同的索引,官方排序這個在ref_or_null之后,但是實際上由于要讀取多個索引,性能可能大部分時間都不如range
unique_subquery
用于where中的in形式子查詢,子查詢返回不重復值唯一值,可以完全替換子查詢,效率更高。
該類型替換了下面形式的IN子查詢的ref:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery
子查詢中的返回結果字段組合是一個索引(或索引組合),但不是一個主鍵或唯一索引
range
索引范圍查詢,常見于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等運算符的查詢中。
index
索引全表掃描,把索引從頭到尾掃一遍
all
全表掃描,性能最差。
該列顯示的為分區表命中的分區情況。非分區表該字段為空(null)。
查詢可能使用到的索引都會在這里列出來
優化器從possible_keys中選擇使用的索引。
查詢用到的索引長度(字節數)。key_len只計算where條件用到的索引長度,而排序和分組就算用到了索引,也不會計算到key_len中。
如果是使用的常數等值查詢,這里會顯示const,如果是連接查詢,被驅動表的執行計劃這里會顯示驅動表的關聯字段,如果是條件使用了表達式或者函數,或者條件列發生了內部隱式轉換,這里可能顯示為func
rows 也是一個重要的字段。這是mysql估算的需要掃描的行數(不是精確值)。
這個值非常直觀顯示 SQL 的效率好壞, 原則上 rows 越少越好.
這個字段表示存儲引擎返回的數據在server層過濾后,剩下多少滿足查詢的記錄數量的比例,注意是百分比,不是具體記錄數。這個字段不重要
EXplain 中的很多額外的信息會在 Extra 字段顯示, 常見的有以下幾種內容:
. using index : 出現這個說明mysql使用了覆蓋索引,避免訪問了表的數據行,效率不錯。
. using where :這說明服務器在存儲引擎收到行后講進行過濾。
. using temporary :這意味著mysql對查詢結果進行排序的時候使用了一張臨時表
. using filesort :這個說明mysql會對數據使用一個外部的索引排序
上述就是小編為大家分享的MySQL中explain字段的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。