天天看點

EXPLAIN執行計劃中要重點關注哪些要素

導讀

EXPLAIN的結果中,有哪些關鍵資訊值得注意呢?

MySQL的EXPLAIN當然和ORACLE的沒法比,不過我們從它輸出的結果中,也可以得到很多有用的資訊。

總的來說,我們隻需要關注結果中的幾列:

列名 備注
type 本次查詢表聯接類型,從這裡可以看到本次查詢大概的效率
key 最終選擇的索引,如果沒有索引的話,本次查詢效率通常很差
key_len 本次查詢用于結果過濾的索引實際長度,參見另一篇分享(FAQ系列-解讀EXPLAIN執行計劃中的key_len)
rows 預計需要掃描的記錄數,預計需要掃描的記錄數越小越好
Extra 額外附加資訊,主要确認是否出現 Using filesort、Using temporary 這兩種情況

首先看下 type 有幾種結果,分别表示什麼意思:

類型 備注
ALL 執行full table scan,這是最差的一種方式
index 執行full index scan,并且可以通過索引完成結果掃描并且直接從索引中取的想要的結果資料,也就是可以避免回表,比ALL略好,因為索引檔案通常比全部資料要來的小
range 利用索引進行範圍查詢,比index略好
index_subquery 子查詢中可以用到索引
unique_subquery 子查詢中可以用到唯一索引,效率比 index_subquery 更高些
index_merge 可以利用index merge特性用到多個索引,提高查詢效率
ref_or_null 表連接配接類型是ref,但進行掃描的索引列中可能包含NULL值
fulltext 全文檢索
ref 基于索引的等值查詢,或者表間等值連接配接
eq_ref 表連接配接時基于主鍵或非NULL的唯一索引完成掃描,比ref略好
const 基于主鍵或唯一索引唯一值查詢,最多傳回一條結果,比eq_ref略好
system 查詢對象表隻有一行資料,這是最好的情況

上面幾種情況,從上到下依次是最差到最好。

再來看下Extra列中需要注意出現的幾種情況:

關鍵字 備注
Using filesort 将用外部排序而不是按照索引順序排列結果,資料較少時從記憶體排序,否則需要在磁盤完成排序,代價非常高,需要添加合适的索引
Using temporary 需要建立一個臨時表來存儲結果,這通常發生在對沒有索引的列進行GROUP BY時,或者ORDER BY裡的列不都在索引裡,需要添加合适的索引
Using index 表示MySQL使用覆寫索引避免全表掃描,不需要再到表中進行二次查找資料,這是比較好的結果之一。注意不要和type中的index類型混淆
Using where 通常是進行了全表/全索引掃描後再用WHERE子句完成結果過濾,需要添加合适的索引
Impossible WHERE 對Where子句判斷的結果總是false而不能選擇任何資料,例如where 1=0,無需過多關注
Select tables optimized away 使用某些聚合函數來通路存在索引的某個字段時,優化器會通過索引直接一次定位到所需要的資料行完成整個查詢,例如MIN()\MAX(),這種也是比較好的結果之一

版權聲明:本文為CSDN部落客「weixin_33843947」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33843947/article/details/92030304