不少狀況下咱們須要知道某條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
命令中常用到的列有id、優化
id是一個編號,標識SELECT
所屬的行。若是在語句當中沒有子查詢或聯合查詢,那麼以後有惟一的SELECT,因而每一行在這個列中都顯示1。不然,內層的SELECT語句通常會順序編號,對應於其在語句中的位置。code
SELECT列中子查詢
blog
FROM子句中的子查詢
排序
UNION查詢
索引
注意UNION
結果老是放在一個匿名臨時表中,以後MySQL將結果讀取到臨時表外。臨時表不在原SQL中出現,所以它的id
列是NULL
io
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
列顯示了對應行在訪問哪一個表。在一般狀況下,它至關明瞭:它就是那個表,或是該表的別名。當FROM
子句中有子查詢或有UNION
時,table列會變得複雜得多。
FROM
子句中有子查詢時,table
列是<derivedN>,其中N是子查詢的id
UNION
時,UNION RESULT
的table
列中包含一個參與UNION
的id
列表,如<union1,2>type
表示的是訪問類型,也就是說MySQL決定如何查找表中的行。下面列表中依次從最差到最優:
type | 描述 |
---|---|
ALL |
全表掃描,從頭至尾掃描整個表,效率最差 |
index |
和全表掃描同樣,只是MySQL掃描表時按索引次序進行而不是行,主要優勢時避免了排序 |
range |
範圍掃描就是一個有限制的索引掃描,它開始於索引裏的某一點,返回匹配這個值域的行。BETWEEN ,IN 和OR 都屬於這類 |
ref |
這是一種索引訪問(索引查找),它返回全部匹配某個單個值的行。當使用非惟一性索引或者惟一性索引的非惟一性前綴時纔會發生 |
eq_ref |
使用這種索引查找,MySQL知道最多隻返回一條符合條件的記錄。在使用主鍵或者惟一性索引查找時發生 |
const、system |
當MySQL能對查詢的某部分進行優化並將其轉換成一個常量時,它就會使用這種類型。若是經過將某一行的主鍵放入WHERE子句裏的方式來選取次行的主鍵,MySQL就能幫這個查詢轉換爲一個常量 |
NULL |
意味着MySQL能在優化階段分解查詢語句,在執行階段甚至用不着再訪問表或索引。如從一個索引列裏面選取最小值能夠經過單獨查找索引來完成,不須要在執行時訪問表 |
possible_keys
表示查詢可能使用哪些索引,這是基於查詢訪問的列和使用的比較操做符來判斷的
key
顯示了MySQL決定採用哪一個索引來優化對錶的訪問。若是該索引沒有出如今possible_keys
列中,那麼MySQL可能選擇了一個覆蓋索引,哪怕沒有WHERE
子句
key_len
顯示了MySQL在索引字段中可能的最大長度。當索引字段是多個時,長度爲多個字段長度的和,每一個字段的長度是根據定義的表結構中的長度來計算的
ref
顯示了以前的表在key列記錄的索引中查找值所用的列或常量。
rows
表示估計爲了找到所需的行而要讀取的行數。這個值越小越好
filtered
顯示的是針對表裏符合某個條件的記錄數的百分比所作的一個悲觀估算。若是你把rows
列和這個百分比相乘,就能看到MySQL估算它將和查詢計劃裏面一個表關聯的行數。
Extra
包含的是不適合在其餘列顯示的額外信息。具體以下:
Extra | 描述 |
---|---|
Using index |
意味着MySQL使用覆蓋索引,避免訪問表 |
Using where |
意味着MySQL服務器將在存儲引擎檢索行後再進行過濾,並非全部的WHERE 條件查詢都有 |
Using temporary |
意味着MySQL在對查詢結果排序時使用一個臨時表 |
Using filesort |
意味着MySQL會對結果使用一個外部索引排序,而不是按索引次序從表裏讀取行 |
Range checked for each record (index map: N) |
這個值意味着沒有好用的索引,新的索引將在聯接的每一行上從新估算。工做中暫時沒有遇到 |
以上內容若有描述錯誤的地方但願你們能夠幫忙指出,一塊兒交流學習!