mysql explain 執行計劃
阿新 • • 發佈:2021-06-17
使用方法
explain select * from t
欄位解釋
id
select 查詢序列號,表示sql語句執行的順序
select_type
- simple: 表示最簡單的select,沒有union和子查詢
- primary: 最外面的查詢或者主查詢,在有子查詢的語句中,最外面的select查詢就是primary
- subquery: 子查詢
- union: union語句的第二個或者最後那一個select
- union result: unino之後的結果
- derived:衍生表
table
所查詢的表,簡稱,或者是中間表
type
- const: 表中最多有一個匹配行,const用於比較primary key 或者unique索引快
- eq_ref: 唯一性索引掃描,對於每個來自於前面的表的記錄,從該表中讀取唯一一行
- ref: 非唯一性索引掃描,對於每個來自於前面的表的記錄,所有匹配的行從這張表取出
- index_merge:查詢語句中用到了一張表的多個索引時,mysql會將多個索引合併到一起
- range:按指定範圍(如 in,<,>,between,and等,但是前提是此欄位要建立索引)來檢索
- index: 全索引掃描,通常比All快,因為索引檔案通常比資料檔案小
- all :全表掃描,多數情況下需要優化
possible_keys
可能使用到的索引
key
實際使用的索引
key_len
索引欄位的長度
ref
列與索引的比較,表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值
rows
掃描的行數
filtered
按表條件過濾的行百分比
extra
- using index:使用了覆蓋索引(Covering Index),即通過索引就能返回結果,無需訪問表
- using where:查詢使用了where 語句來處理結果
- using join buffer:獲取連線條件時沒有使用索引,並且需要連線緩衝區來儲存中間結果
- using filesort:這是 order by 語句的結果。這可能是一個CPU密集型的過程。using filesort表示出現了檔案內排 序,表示很不好的現象,必須要優化,特別是大表,可以通過選擇合適的索引來改進效能,用索引來為查詢結果排序
- using temporary:mysql需要建立一張臨時表來儲存中間結果。 也就是說,需要先把資料放到臨時表中,然後從臨時 表中獲取需要的資料。出現這種臨時表,也是必須需要優化的地方,特別是資料量大的情況。兩個常見的原因是在來自 不同表的列上使用了distinct,或者使用了不同的 order by 和 group by 列