MySQL中EXPLAIN命令詳細解析

不少狀況下咱們須要知道某條SQL語句的性能,都會經過EXPLAIN命令來查看查詢優化器是如何執行的。服務器

如何使用

使用EXPLAIN很簡單,只須要在執行的SQL前面加上EXPLAIN便可性能

explain select s.sid sid, s.name studentName, s.age age, c.name className from student_class sc, student s, class c;

執行結果以下:
如何使用explain命令學習

EXPLAIN中的列

EXPLAIN命令中常用到的列有id、優化

id

id是一個編號,標識SELECT所屬的行。若是在語句當中沒有子查詢或聯合查詢,那麼以後有惟一的SELECT,因而每一行在這個列中都顯示1。不然,內層的SELECT語句通常會順序編號,對應於其在語句中的位置。code

  • SELECT列中子查詢
    SELECT列中子查詢blog

  • FROM子句中的子查詢
    FROM子句中的子查詢排序

  • UNION查詢
    UNION查詢索引

注意UNION結果老是放在一個匿名臨時表中,以後MySQL將結果讀取到臨時表外。臨時表不在原SQL中出現,所以它的id列是NULLio

select_type

select_type列顯示了對應行是簡單仍是複雜SELECT,具體以下:table

select_type 描述
SIMPLE 簡單查詢,不包含任何複雜的子查詢(FROM子句中的子查詢除外)
PRIMARY 複雜查詢
SUBQUERY 複雜查詢,包含在SELECT列表中的SELECT標記爲SUBQUERY
DERIVED 複雜查詢,包含在FROM子句中的查詢
UNION 複雜查詢,在UNION查詢中的第二個和隨後的SELECT被標記爲UNION
UNION RESULT 複雜查詢,用來從UNION的匿名臨時表檢索結果的SELECT被標記爲UNION RESULT
table

table列顯示了對應行在訪問哪一個表。在一般狀況下,它至關明瞭:它就是那個表,或是該表的別名。當FROM子句中有子查詢或有UNION時,table列會變得複雜得多。

  • FROM子句中有子查詢時,table列是<derivedN>,其中N是子查詢的id
  • 當有UNION時,UNION RESULTtable列中包含一個參與UNIONid列表,如<union1,2>
type

type表示的是訪問類型,也就是說MySQL決定如何查找表中的行。下面列表中依次從最差到最優

type 描述
ALL 全表掃描,從頭至尾掃描整個表,效率最差
index 和全表掃描同樣,只是MySQL掃描表時按索引次序進行而不是行,主要優勢時避免了排序
range 範圍掃描就是一個有限制的索引掃描,它開始於索引裏的某一點,返回匹配這個值域的行。BETWEENINOR都屬於這類
ref 這是一種索引訪問(索引查找),它返回全部匹配某個單個值的行。當使用非惟一性索引或者惟一性索引的非惟一性前綴時纔會發生
eq_ref 使用這種索引查找,MySQL知道最多隻返回一條符合條件的記錄。在使用主鍵或者惟一性索引查找時發生
const、system 當MySQL能對查詢的某部分進行優化並將其轉換成一個常量時,它就會使用這種類型。若是經過將某一行的主鍵放入WHERE子句裏的方式來選取次行的主鍵,MySQL就能幫這個查詢轉換爲一個常量
NULL 意味着MySQL能在優化階段分解查詢語句,在執行階段甚至用不着再訪問表或索引。如從一個索引列裏面選取最小值能夠經過單獨查找索引來完成,不須要在執行時訪問表
possible_keys

possible_keys表示查詢可能使用哪些索引,這是基於查詢訪問的列和使用的比較操做符來判斷的

key

key顯示了MySQL決定採用哪一個索引來優化對錶的訪問。若是該索引沒有出如今possible_keys列中,那麼MySQL可能選擇了一個覆蓋索引,哪怕沒有WHERE子句

key_len

key_len顯示了MySQL在索引字段中可能的最大長度。當索引字段是多個時,長度爲多個字段長度的和,每一個字段的長度是根據定義的表結構中的長度來計算的

ref

ref顯示了以前的表在key列記錄的索引中查找值所用的列或常量。

rows

rows表示估計爲了找到所需的行而要讀取的行數。這個值越小越好

filtered

filtered顯示的是針對表裏符合某個條件的記錄數的百分比所作的一個悲觀估算。若是你把rows列和這個百分比相乘,就能看到MySQL估算它將和查詢計劃裏面一個表關聯的行數。

Extra

Extra包含的是不適合在其餘列顯示的額外信息。具體以下:

Extra 描述
Using index 意味着MySQL使用覆蓋索引,避免訪問表
Using where 意味着MySQL服務器將在存儲引擎檢索行後再進行過濾,並非全部的WHERE條件查詢都有
Using temporary 意味着MySQL在對查詢結果排序時使用一個臨時表
Using filesort 意味着MySQL會對結果使用一個外部索引排序,而不是按索引次序從表裏讀取行
Range checked for each record (index map: N) 這個值意味着沒有好用的索引,新的索引將在聯接的每一行上從新估算。工做中暫時沒有遇到

以上內容若有描述錯誤的地方但願你們能夠幫忙指出,一塊兒交流學習!

相關文章
相關標籤/搜索