SQL查詢語句性能分析(EXPLAIN)

作用

  • 表的讀取順序
  • 數據讀取操作的操作類型
  • 哪些索引可以使用
  • 哪些索引被實際使用
  • 表之間的引用
  • 每張表有多少行被優化器查詢

使用格式


explain <select語句>
如:explain select * from test_table;

執行結果


共有如下十二個字段

id


id是select查詢的序列好,包含一組數字,表示查詢中執行select子語句或操作表的順序

  • id相同,執行順序由上至下
  • id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行
  • id中相同和不同都可能同時存在

select_type


select_type是指查詢的類型,主要用於區分普通查詢、聯合查詢、子查詢等複雜查詢

  • SIMPLE:簡單的select查詢,查詢中不包含子查詢或者union
  • PRIMARY:查詢中若包含任何複雜的子部分,最外層查詢則被標記爲PRIMARY
  • SUBQUERY:在select或where列表中包含的子查詢
  • DERIVED:在from列表中包含的子查詢被標記爲DERIVED(衍生),MYSQL會遞歸執行這些子查詢,把結果放到臨時表中
  • UNION:若第二個select出現在union之後,則標記爲union;若union包含在from子句中,外層select則被標記爲DERIVED
  • UNION RESULT:從union表獲取結果的select

table


table是顯示這一行的數據是關於哪張表的

type


type顯示的是訪問類型,是較爲重要的一個指標,結果值從好到壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

  • system:表只有一行記錄或沒有記錄,這是const類型的特例,只有系統表纔會有這個類型
  • const:標識通過索引一次就找到了。const用於比較primary key或unique索引。因爲只匹配一行數據,所以很快
  • eq_ref:唯一性索引掃描,對於每個索引列,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃描
  • ref:非唯一性索引掃描,返回匹配某個單獨值的所有行。本質上也是一種索引訪問,它返回所有匹配某個單獨值的行。然而,它可能會找到多個符合條件的行,所以它應該屬於查找和掃描的結合體。
  • range:只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用哪個索引。一般就是在where語句中出現了between、<、>、in等查詢。這種索引掃描比全表掃描要好,因爲它開始於索引的某一點,結束於另一點,不需要掃描全部索引。
  • all:遍歷全表

possible_keys


可能會用到的索引(意義不大,可忽略)

key


實際使用到的索引。如果是null,則沒有使用索引,對應type爲all。查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊。

key_len


索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好。key_len顯示的值爲索引字段的最大長度,並非實際使用長度,即key_len顯示的值爲索引字段的最大可能長度,並非實際使用的長度,即key_len是根據表定義計算而得,不是通過表內索引得出。

  • 根據這個值,可以判斷索引使用情況,特別是在組合索引的時候,判斷所有索引字段是否都被查詢使用到
  • char和varchar跟字符編碼也有密切關係
  • latin佔用1個字節,gbk佔用2個字節,utf8佔用3個字節

ref


如果是使用的常數等值查詢,這裏會顯示const;如果是鏈接查詢,被驅動表的執行計劃這裏會顯示驅動表的關聯字段;如果是條件使用了表達式或函數,或者條件列發生了內部隱式轉換,這裏可能顯示爲func

rows


根據表統計信息及索引選用情況,大致估算出找到所需的記錄所需要的讀取的行數

extra

  • distinct:在select部分使用了distinct關鍵字
  • no tables used:不帶from子句的查詢或者from dual查詢
  • using filesort:排序時無法使用到索引時,就會出現這個。常見於order by和group by語句
  • using index:查詢時不需要回表查詢,直接通過索引就可以獲取到查詢數據(性能非常好)
  • using intersect:標識使用and的各個索引的條件時,該信息表示是從處理結果獲取的交集
  • using union:標識使用or鏈接各個使用索引的條件時,該信息表示從處理結果獲取的並集
  • using where:表示存儲引擎返回的記錄並不是所有的都滿足查詢條件,需要在server層進行過濾

參考:
博客鏈接: 壞蛋呆呆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章