MySQL(八) — 執行計劃(Explain)詳解

目錄

執行計劃

執行計劃的作用

執行計劃如何使用

執行計劃內容

id

select_type

table

type

possible_keys

key

key_len

ref

rows

extra


執行計劃

執行計劃的作用

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

執行計劃如何使用

explain  <sql語句>

如 explain  select * from test;

執行計劃內容

id

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

三種情況:

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

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

3、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

key表示實際使用到的索引。如果爲null,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊。

key_len

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

  • key_len表示索引使用的字節數。
  • 根據這個值,就可以判斷索引使用情況,特別是在組合索引的時候,判斷所有的索引字段是否都被查詢用到。
  • char和varchar跟字符編碼也有密切的聯繫。
  • latin1佔用1個字節,gbk佔用2個字節,utf8佔用3個字節。(不同字符編碼佔用的存儲空間不同)。

ref

表示哪些列或常量被用於查找索引列上的值;顯示索引的哪一列被使用了,如果可能的話,最好是一個常數。

rows

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

extra

Extra表示包含不適合在其他列中顯示但十分重要的額外信息。

  • Using filesort:說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。MySQL中無法利用索引完成的排序操作稱爲“文件排序”。
  • Using temporary:使了用臨時表保存中間結果,MySQL在對查詢結果排序時使用臨時表。常見於排序 order by 和分組查詢 group by。
  • Using index:是否使用了覆蓋索引。
  • Using where:表明使用了where過濾。
  • Using join buffer:使用了連接緩存。
  • Impossible where:where子句的值總是false,不能用來獲取任何元組。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章