Mysql的Explain關鍵字
參考博客:https://segmentfault.com/a/1190000008131735
MySQL 提供了一個 EXPLAIN 命令, 它可以對 SELECT
語句進行分析, 並輸出 SELECT
執行的詳細信息, 以供開發人員針對性優化.
大概有以下這些字段
+----+-------------+-------+------+---------------+------+---------+------+------+-------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra|
+----+-------------+-------+------+---------------+------+---------+------+------+-------
id
id是用來順序標識整個查詢中SELELCT 語句的,在嵌套查詢中id越大的語句越先執行。該值可能爲NULL,如果這一行用來說明的是其他行的聯合結果。
select_type
表示查詢的類型
- SIMPLE, 表示此查詢不包含 UNION 查詢或子查詢
- PRIMARY, 表示此查詢是最外層的查詢
- UNION, 表示此查詢是 UNION 的第二或隨後的查詢
- DEPENDENT UNION, UNION 中的第二個或後面的查詢語句, 取決於外面的查詢
- UNION RESULT, UNION 的結果
- SUBQUERY, 子查詢中的第一個 SELECT
- DEPENDENT SUBQUERY: 子查詢中的第一個 SELECT, 取決於外面的查詢. 即子查詢依賴於外層查詢的結果.
table
對應行正在訪問哪一個表,表名或者別名
type
這個是重點,是優化查詢的關鍵字段。
在表中,查詢速度從上到下依次遞減
類型 | 說明 |
---|---|
Null | 意味說mysql能在優化階段分解查詢語句,在執行階段甚至用不到訪問表或索引(高效 |
system | 這是const連接類型的一種特例,表僅有一行滿足條件。 |
const | 當確定最多隻會有一行匹配的時候,MySQL優化器會在查詢前讀取它而且只讀取一次,因此非常快。當主鍵放入where子句時,mysql把這個查詢轉爲一個常量(高效) |
eq_ref | 最多隻返回一條符合條件的記錄。使用唯一性索引或主鍵查找時會發生 (高效) |
ref | 一種索引訪問,它返回所有匹配某個單個值的行。此類索引訪問只有當使用非唯一性索引或唯一性索引非唯一性前綴時纔會發生。這個類型跟eq_ref不同的是,它用在關聯操作只使用了索引的最左前綴,或者索引不是UNIQUE和PRIMARY KEY。ref可以用於使用=或<=>操作符的帶索引的列。 |
range | 範圍掃描,一個有限制的索引掃描。key 列顯示使用了哪個索引。當使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比較關鍵字列時,可以使用 range |
index | 和全表掃描一樣。只是掃描表的時候按照索引次序進行而不是行。主要優點就是避免了排序, 但是開銷仍然非常大。如在Extra列看到Using index,說明正在使用覆蓋索引,只掃描索引的數據,它比按索引次序全表掃描的開銷要小很多 |
All | 最壞的情況,全表掃描 |
possible_keys
顯示查詢使用了哪些索引,表示該索引可以進行高效地查找,但是列出來的索引對於後續優化過程可能是沒有用的
key
key列顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL。
key_len
表示查詢優化器使用了索引的字節數. 這個字段可以評估組合索引是否完全被使用, 或只有最左部分字段被使用到.
ref
ref列顯示使用哪個列或常數與key一起從表中選擇行。
rows
rows列顯示MySQL認爲它執行查詢時必須檢查的行數。注意這是一個預估值。
Extra
Extra是EXPLAIN輸出中另外一個很重要的列,該列顯示MySQL在查詢過程中的一些詳細信息,MySQL查詢優化器執行查詢的過程中對查詢計劃的重要補充信息。