對SQL查詢語句執(zhí)行explain命令可以得到SQL語句的執(zhí)行計劃霉晕。
id:序號,表示查詢中執(zhí)行select子句或操作表的順序
-
id相同
上-->下依次執(zhí)行 -
id不同
id大的優(yōu)先執(zhí)行兰绣; -
id部分相同
id大的優(yōu)先執(zhí)行,id相同的上-->下依次執(zhí)行
select_type:查詢中每個select子句的類型(簡單OR復(fù)雜)
-
SIMPLE
不包含子查詢或者UNION的查詢被標(biāo)記為SIMPLE -
PRIMARY
復(fù)雜查詢的最外層查詢被標(biāo)記為PRIMARY -
SUBQUERY
在SELECT或WHERE子句中的子查詢 -
DERIVED
FROM子句中包含的子查詢,該子查詢會產(chǎn)生臨時表(派生表) -
UNION
出現(xiàn)在UNION之后的SELECT語句會被標(biāo)記為UNION -
DEPENDENT UNION
UNION之后SELECT語句,同時又依賴外部的查詢 -
UNION RESULT
從UNION獲取結(jié)果的SELECT被標(biāo)記為UNION RESULT
table:顯示查詢的表名
partitions:表的分區(qū)(MySQL5.7新功能)
type:查詢方式(特別重要的一項橄镜,關(guān)系到查詢效率)
查詢效率:ALL < index < range < ref < eq_ref < const < system < NULL
- ALL:全表掃描
- index:遍歷索引
- range:索引范圍掃描
- ref:非唯一索引查找或唯一索引前綴查找
- eq_ref:唯一索引查找
- const:最多只有1條記錄匹配
- system:僅有1條記錄匹配
- NULL:不用訪問表或索引
possible_keys:可能使用的索引
key:實際使用的索引
key_len:索引字節(jié)數(shù)
ref:被用于索引查找的列或常量
rows:查找記錄需要讀取的行數(shù)
filtered:
Extra:額外信息(重要)
-
Using index
使用了覆蓋索引(Covering Index) -
Using temporary
使用了臨時表(需要優(yōu)化) -
Not exists
MYSQL優(yōu)化了LEFT JOIN,一旦找到了匹配LEFT JOIN標(biāo)準(zhǔn)的行冯乘, 就不再搜索了 -
Using where
數(shù)據(jù)從存儲引擎返回后再使用where過濾 -
Using index condition
MySQL原來在索引上是不能執(zhí)行如like這樣的操作的洽胶,5.6以后可以了,這樣減少了不必要的IO操作裆馒,但是只能用在二級索引上 -
Using filesort
無法使用索引排序姊氓,單并不是在文件排序,而是盡可能在內(nèi)存排序(此時也應(yīng)優(yōu)化) -
Using join buffer
在獲取連接條件時沒有使用索引喷好,并且需要連接緩沖區(qū)來存儲中間結(jié)果(需要使用索引來優(yōu)化) -
Impossible where
where語句會導(dǎo)致沒有符合條件的行 -
Select tables optimized away
僅使用索引他膳,優(yōu)化器可能僅從聚合函數(shù)結(jié)果中返回一行 -
Index merges
當(dāng)MySQL 決定要在一個給定的表上使用超過一個索引的時候,就會出現(xiàn)以下格式中的一個绒窑,詳細說明使用的索引以及合并的類型
Using sort_union(...)
Using union(...)
Using intersect(...)