MySQL中explain輸出詳解
id列
id列的序號是select語句的編號,id越大執(zhí)行的優(yōu)先級就越高赤炒,可能會出現(xiàn)相同id的情況氯析,這時按照id分組,id相同時按照從上到下的順序執(zhí)行莺褒,如果id為空則最后執(zhí)行-
select_type列
表示對應(yīng)數(shù)據(jù)的查詢類型掩缓,可能的情況有:simple:不包含子查詢和union的簡單查詢
primary:復(fù)雜查詢中的最外層查詢
subquery:包含在select中的子查詢(不在from子句中)
derived:包含在from子句中的子查詢,對于這種查詢類型遵岩,MySQL會將結(jié)果集放在一個臨時表中你辣,也叫做衍生表
union:表示使用union連接后的查詢語句,union result表示合并的結(jié)果
-
table列
表示當(dāng)前查詢訪問的是哪張表尘执。當(dāng)from子句中有子查詢時舍哄,table的輸出格式為“<derivedN>”,其中誊锭,N代表id列的值表悬,表示當(dāng)前語句依賴id=N的查詢,所以先執(zhí)行id=N的語句炉旷,如果使用EXPLAIN分析帶有子查詢的語句table列卻沒有相似輸出签孔,那是因為優(yōu)化對臨時表做了優(yōu)化,只需要關(guān)閉這個優(yōu)化選項就可以看見了窘行,示例如下set session optimizer_switch = 'derived_merge=off'; #關(guān)閉優(yōu)化器對臨時表的合并優(yōu)化 EXPLAIN SELECT * FROM (SELECT * FROM table_xxx WHERE id = '1580133829666242561') t; set session optimizer_switch = 'derived_merge=on'; #執(zhí)行完開啟優(yōu)化器對臨時表的合并優(yōu)化
partitions列
表示查詢數(shù)據(jù)的分區(qū)饥追,對于非分區(qū)表,列值為null-
type列
這是比較重要的一列信息罐盔,表示關(guān)聯(lián)類型或訪問類型但绕,訪問效率從高到低分別是 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,一般情況下要求SQL達到range級別惶看,甚至是ref- ALL:全表掃描
- index:全索引掃描捏顺,主要有兩種情況,一是我們需要的數(shù)據(jù)就在索引中纬黎,可以直接獲取幅骄,二是使用索引進行排序
- range:表示利用索引查詢的時候限制了范圍,在指定范圍內(nèi)進行查詢本今,這樣避免了index的全索引掃描拆座,適用的操作符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()
- index_subquery:利用索引來關(guān)聯(lián)子查詢主巍,不再掃描全表
- unique_subquery:該連接類型類似與index_subquery,使用的是唯一索引
- index_merge:在查詢過程中需要多個索引組合使用
- ref_or_null:對于某個字段即需要關(guān)聯(lián)條件挪凑,也需要null值的情況下孕索,查詢優(yōu)化器會選擇這種訪問方式
- ref:使用了非唯一性索引進行數(shù)據(jù)的查找
- eq_ref :使用唯一性索引進行數(shù)據(jù)查找
- const:這個表至多有一個匹配行
- system:表只有一行記錄(等于系統(tǒng)表),這是const類型的特例躏碳,平時不會出現(xiàn)
-
possible_keys列
顯示可能應(yīng)用在這張表中的索引搞旭,一個或多個,查詢涉及到的字段上若存在索引菇绵,則該索引將被列出肄渗,但不一定被查詢實際使用
key
實際使用的索引,如果為null脸甘,則沒有使用索引恳啥,查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊key_len
表示索引中使用的字節(jié)數(shù)丹诀,可以通過key_len計算查詢中使用的索引長度钝的,在不損失精度的情況下長度越短越好ref:此列顯示key列記錄的索引中,表查找值時使用到的列或常量铆遭。常見的有const硝桩、字段名
rows:此列是MySQL在查詢中估計要讀取的行數(shù)。注意這里不是結(jié)果集的行數(shù)
filtered:通過過濾條件之后對比總數(shù)的百分比
-
extra:額外信息
- Using filesort:當(dāng)Query中包含 order by 操作枚荣,而且無法利用索引完成的排序操作稱為“文件排序”
- using temporary:建立臨時表來保存中間結(jié)果碗脊,查詢完成之后把臨時表刪除
- Using where:不用讀取表中所有信息,僅通過索引就可以獲取所需數(shù)據(jù)橄妆,這發(fā)生在對表的全部的請求列都是同一個索引的部分的時候衙伶,表示mysql服務(wù)器將在存儲引擎檢索行后再進行過濾
- Using temporary:表示MySQL需要使用臨時表來存儲結(jié)果集,常見于排序和分組查詢害碾,常見 group by ; order by
- Using join buffer:改值強調(diào)了在獲取連接條件時沒有使用索引矢劲,并且需要連接緩沖區(qū)來存儲中間結(jié)果。如果出現(xiàn)了這個值慌随,那應(yīng)該注意芬沉,根據(jù)查詢的具體情況可能需要添加索引來改進能
- Impossible where:這個值強調(diào)了where語句會導(dǎo)致沒有符合條件的行(通過收集統(tǒng)計信息不可能存在結(jié)果)
- Select tables optimized away:這個值意味著僅通過使用索引,優(yōu)化器可能僅從聚合函數(shù)結(jié)果中返回一行
- No tables used:Query語句中使用from dual 或不含任何from子句
- using index:表示使用到了索引 , 并且所取的數(shù)據(jù)完全在索引中就能拿到