檢視執行計劃
執行如下語句可以看到語句的執行計劃
explain select SQL_NO_CACHE id from test_innodb where id=‘2’
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL98GWjZWMHVmb1cVWvB3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzMDN0UzN0kDM1AzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
執行計劃中各個字段的含義如下:
執行計劃資訊-id
select 查詢的序列号,辨別執行的順序
1、id相同,執行順序由上至下
2、id不同,如果是子查詢,id的序号會遞增,id值越大優先級越高,越先被執行
3、id相同又不同即兩種情況同時存在,id如果相同,可以認為是一組,從上往下順序
執行;在所有組中,id值越大,優先級越高,越先執行
id 為null 的情況
執行計劃資訊-select_type
查詢的類型,主要是用于區分普通查詢、聯合查詢、子查詢等
SIMPLE:簡單的select查詢,查詢中不包含子查詢和union
PRIMARY:查詢中包含子部分,最外層查詢則被标記為primary
SUBQUERY/MATERIALIZED:SUBQUERY表示在select 或 where清單中包含了子查詢 MATERIALIZED表示where 後面in條件的子查詢
UNION:若第二個select出現在union之後,則被标記為union;
UNION RESULT:從union表擷取結果的select
執行計劃資訊-table
查詢涉及到的表
直接顯示表名或者表的别名
<unionM,N> 由ID為M,N 查詢union産生的結果 參見上圖
由ID為N查詢生産的結果
執行計劃資訊-type
通路類型,sql 查詢優化中一個很重要的名額,結果值從好到壞依次是:
system > const > eq_ref > ref > range > index > ALL
system:表隻有一行記錄(等于系統表),const類型的特例,基本不會出現,可以忽略不計
const:表示通過索引一次就找到了,const用于比較primary key 或者 unique索引
eq_ref:唯一索引掃描,對于每個索引鍵,表中隻有一條記錄與之比對。常見于主鍵 或 唯一索引掃描
ref:非唯一性索引掃描,傳回比對某個單獨值的所有行,本質是也是一種索引通路
range:隻檢索給定範圍的行,使用一個索引來選擇行 使用索引的範圍查詢 比如 id>1 and id<100
index:Full Index Scan,索引全表掃描,把索引從頭到尾掃一遍 id like ‘%1%’
ALL:Full Table Scan,周遊全表以找到比對的行
執行計劃資訊- possible_keys key rows filtered
possible_keys 查詢過程中有可能用到的索引
key 實際使用的索引,如果為 NULL ,則沒有使用索引
rows 根據表統計資訊或者索引選用情況,大緻估算出找到所需的記錄所需要讀取的行數
filtered 它指傳回結果的行占需要讀到的行 (rows 列的值) ) 的百分比,表示傳回結果的行數占需讀取行數的百分比, filtered 的值越大越好
執行計劃資訊-extra 額外資訊
1 )Using filesort :mysql 對資料使用一個外部的檔案内容進行了排序,而不是按照表内的索引進行排序讀取
2 )Using temporary :使用臨時表儲存中間結果,也就是說mysql 在對查詢結果排序時使用了臨時表,常見于order by 或 group by
3 )Using index :表示相應的select 操作中使用了覆寫索引(Covering Index ),避免了通路表的資料行,效率高
4 )Using where :使用了where 過濾條件 where name =‘name’
5 )select tables optimized away :基于索引優化MIN/MAX 操作或者MyISAM 存儲引擎優化COUNT(*) 操作,不必等到執行階段在進行計算,查詢執行計劃生成的階段即可完成優化