一條查詢語句執(zhí)行過程
EXPLAIN 基本語法
explain [extended|partition]select
字段說明
字段 | 說明 |
---|---|
id | 執(zhí)行編號像寒,標(biāo)識 select 所屬的行橄仍。如果在語句中沒子查詢或關(guān)聯(lián)查詢耀态,只有唯一的 select 谊惭,每行都將顯示 1空骚。否則叠国,內(nèi)層的 select 語句一般會順序編號衩匣,對應(yīng)于其在原始語句中的位置 |
select_type | 顯示本行是簡單或復(fù)雜select蕾总。如果查詢有任何復(fù)雜的子查詢,則最外層標(biāo)記為PRIMARY(DERIVED琅捏、UNION生百、UNION RESUlT) |
table | 訪問查詢的表名或表別名 |
partitions | 查詢訪問的分區(qū) |
type | 表的訪問類型( MySQL 如何查詢表中的行記錄)效率高低:const / eq_ref / ref / range / index / all
|
possible_keys | 可能使用的索引 |
key | 實際使用的索引 |
key_len | 實際使用的索引長度(單位:字節(jié)) |
ref | 用于索引查找的值的來源,如果值未常量柄延,則 ref 為 const
|
rows | 預(yù)計查詢需要掃描的行數(shù)(在表或索引樹中) |
filtered | 查詢條件所過濾的行記錄數(shù)占比 |
Extra | 額外的信息 |
id
id
為數(shù)值蚀浆,表示在查詢過程中,SELECT
語句的執(zhí)行順序
- 如果
id
值相同搜吧,則執(zhí)行順序為:從上到下 - 如果
id
值不同市俊,則執(zhí)行順序為:id
值越大的越先執(zhí)行 - 如果
id
值相同,則可以認為他們是同一分組滤奈,同一分組中執(zhí)行順序為:從上到下摆昧,在所有組中,id
值越大的越先執(zhí)行 - 如果
id
值為null
蜒程,則表示這是一個結(jié)果集
select_type
表示查詢的類型
類型 | 說明 |
---|---|
SIMPLE | 簡單查詢(無 NUION绅你、SUBQUERY 的 SELECT 語句) |
PRIMARY | 在復(fù)雜查詢中伺帘,最外層的 SELECT 語句 |
UNION | 在聯(lián)合查詢中,第二個和隨后的 SELECT 語句 |
DEPENDENT UNION | 在聯(lián)合查詢中忌锯,第二個和隨后的 SELECT 語句伪嫁,并且該 SELECT 語句依賴外層 SELECT 語句 |
UNION RESULT | 聯(lián)合查詢的結(jié)果表 |
SUBQUERY | 不在 FROM 子句中的子查詢 |
DEPENDENT SUBQUERY | 相關(guān)子查詢 |
DERIVED | 派生表(在FROM從句中的子查詢) |
MATERIALIZED | 物化表(非關(guān)聯(lián)子查詢的一種優(yōu)化類型) |
UNCACHEABLE SUBQUERY | 無法緩存的子查詢 |
UNCACHEABLE NUION | 無法緩存的聯(lián)合查詢 |
table
查詢訪問的表名或別名
關(guān)聯(lián)優(yōu)化器會為查詢選擇關(guān)聯(lián)順序,左側(cè)深度優(yōu)先
當(dāng) from
中有子查詢的時候偶垮,表名是 derivedN
的形式张咳,N
指向子查詢,也就是 explain
結(jié)果中的下一列
當(dāng)有 union result
的時候针史,表名是 union 1,2
等的形式晶伦,1,2
表示參與 union
的 query id
注意:MySQL
對待這些表和普通表一樣,但是這些“臨時表”是沒有任何索引的
partitions
type
類型 | 說明 |
---|---|
NULL | 不需要訪問表 |
system | 表中只有一行記錄或空表啄枕,只能用 myisam 和 memory 表 |
const | 當(dāng) MySQL 對查詢進行優(yōu)化將其轉(zhuǎn)換成常量時婚陪,就會使用這個值 |
eq_ref | 出現(xiàn)在多表連接查詢中,驅(qū)動表只有一行記錄频祝,同時連接字段都是非空唯一索引 |
ref | 非唯一索引查找(或唯一索引的前綴查找) |
fulltext | 全文索引查找 |
ref_or_null | 與 ref 類型一致泌参,只是增加了 NULL 的對比, |
unique_subquery | 代替 eq_ref 針對 IN 子查詢的優(yōu)化常空, IN 子句返回唯一索引 |
index_subquery | 與 unique_subquery 相似沽一,但 IN 子句返回非唯一索引 |
range | 索引范圍掃描,使用 BETWEEN漓糙、IN铣缠、>、>=等運算符對索引字段值進行比較 |
index_merge | 使用多個索引匹配查找昆禽,最終獲取合并結(jié)果(交集 AND 蝗蛙、并集 OR ) |
index | 全索引掃描 |
ALL | 全表掃描 |
possible_keys
顯示查詢使用了哪些索引,表示該索引可以進行高效地查找醉鳖,但是列出來的索引對于后續(xù)優(yōu)化過程可能是沒有用的
key
key列顯示MySQL實際決定使用的鍵(索引)捡硅。如果沒有選擇索引,鍵是NULL盗棵。要想強制MySQL使用或忽視possible_keys列中的索引壮韭,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX纹因。
key_len
key_len列顯示MySQL決定使用的鍵長度喷屋。如果鍵是NULL,則長度為NULL瞭恰。使用的索引的長度逼蒙。在不損失精確性的情況下,長度越短越好 。
ref
ref列顯示使用哪個列或常數(shù)與key一起從表中選擇行是牢。
rows
rows列顯示MySQL認為它執(zhí)行查詢時必須檢查的行數(shù)僵井。注意這是一個預(yù)估值。
filtered
存儲引擎層返回給 MySQL 后驳棱,MySQL server 層過濾后批什,剩下滿足條件的行數(shù)比例
Extra
Extra是EXPLAIN輸出中另外一個很重要的列,該列顯示MySQL在查詢過程中的一些詳細信息社搅,MySQL查詢優(yōu)化器執(zhí)行查詢的過程中對查詢計劃的重要補充信息驻债。
類型 | 說明 |
---|---|
Using filesort | 說明 MySQL 無法利用索引排序,進行了額外的排序 |
Using temporary | 使用的臨時表 |
Using index | 使用索引覆蓋形葬,不需要掃描原表合呐,直接通過索引掃描就能得到想要的數(shù)據(jù) |
Using index condition | 使用索引條件過濾 |
Using where | 通過 WHERE 從句的條件來篩選存儲引擎返回的行記錄 |
Using join buffer | 使用了連接緩存:Block Nested Loop,連接算法是塊嵌套循環(huán)連接;Batched Key Access笙以,連接算法是批量索引連接 |
impossible where | where子句的值總是false淌实,不能用來獲取任何元組 |
select tables optimized away | 在沒有GROUP BY子句的情況下,基于索引優(yōu)化MIN/MAX操作猖腕,或者對于MyISAM存儲引擎優(yōu)化COUNT(*)操作拆祈,不必等到執(zhí)行階段再進行計算,查詢執(zhí)行計劃生成的階段即完成優(yōu)化倘感。 |
distinct | 優(yōu)化distinct操作淤年,在找到第一匹配的元組后即停止找同樣值的動作 |