天天看點

mysql調優-檢視執行計劃

檢視執行計劃

執行如下語句可以看到語句的執行計劃

explain select SQL_NO_CACHE id from test_innodb where id=‘2’

mysql調優-檢視執行計劃

執行計劃中各個字段的含義如下:

執行計劃資訊-id

select 查詢的序列号,辨別執行的順序

1、id相同,執行順序由上至下

2、id不同,如果是子查詢,id的序号會遞增,id值越大優先級越高,越先被執行

3、id相同又不同即兩種情況同時存在,id如果相同,可以認為是一組,從上往下順序

執行;在所有組中,id值越大,優先級越高,越先執行

id 為null 的情況

mysql調優-檢視執行計劃

執行計劃資訊-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(*) 操作,不必等到執行階段在進行計算,查詢執行計劃生成的階段即可完成優化

繼續閱讀