Mysql Explain結果字段含義分析

mysql 執行計劃分析

  • sql如何使用索引
  • 聯接查詢的執行順序
  • 查詢掃描的數據行數

ID列

  • id列中的數據爲一組數字,表示執行select語句順序
  • id值相同時,執行順序由上至下
  • id值越大優先級越高,越先被執行

SELECT_TYPE列

  • SIMPLE: 不包含子查詢或是union操作的查詢
  • primary :查詢中如果包含任何子查詢,那麼最外層的查詢則被標記爲 primary
  • SUBQUERY : SELECT列表中的子查詢
  • DEPENDENT SUBQUERY: 依賴外部結果的子查詢
  • UNION Union操作的第二個或是之後的查詢的時爲 union
  • DEPENDENT unioin : 當union作爲子查詢時,第二或是第二個後的查詢的 select_type值
  • union result :union產生的結果集
  • derived :出現在from子句中的子查詢

TABLE列

  • 輸出數據行所在的表的名稱
  • < unionM,N>由ID爲M,N查詢union產生的結果集
  • < derivedN>/< subqueryN> 由Id爲n的查詢產生的結果

PARTITIONS列

  • 對於分區表,顯示查詢的分區ID
  • 對於非分區表,顯示的爲 NULL

TYPE列
性能從上到下,由高到低

  • system 這是const聯接類型的一個特例,當查詢的表只有一行時使用
  • const 表中有且只有一個匹配的行時使用,如對主鍵或是唯一索引的查詢,這是效率最高的聯接方式
  • eq_ref :唯一索引或主鍵引查找,對於每個索引鍵,表中只有一條記錄與之匹配。
  • ref 非唯一索引查找,返回匹配某個單獨值的所有行。
  • ref_or_null 類似於 ref類型的查詢,但是附加了對 null 值列的查詢
  • index_merge 該聯接類型表示使用了索引合併優化的方法
  • range 索引範圍的掃描常見於 between, > ,<這樣的查詢條件
  • index full index scan全索引掃描,通all的區別時,遍歷的時索引樹
  • all full tabel scan 全表掃描,這是效率最差的聯接方式

Extra列

  • Distinct 優化distinct操作,在找到第一匹配的元祖後即停止找同樣的動作
  • Not exists 使用 not exists 來優化查詢
  • Using filesort 使用額外操作進行排序,通常會出現在order by 或 group by 查詢
  • Using index 使用了覆蓋索引進行查詢
  • Using temporary mysql需要使用臨時表來處理查詢,常見於排序,子查詢,和分組查詢
  • Using where 需要在mysql服務器層使用 where條件來過濾數據
  • slect tables /optimized away 直接通過索引來獲得數據,不用訪問表

POSSIBLE_KEYS列

  • 指出mysql能使用那些索引來優化查詢
  • 查詢列所涉及的列上的索引都會被列出來,但不一定會被使用

KEY列

  • 查詢優化器優化查詢實際所使用的索引
  • 如果沒有可用的索引,則顯示 null

KEY_LEN列

  • 表示索引字段的最大的可能長度
  • key_len的長度由字段定義計算而來,並非數據的實際長度

Ref列

  • 表示那些列或常量被用於查找索引列上的值

rows列

  • 表示msql通過索引的統計信息,估算的所需讀取的行數
  • rows值的大小時個統計抽樣的結果,並不十分的準確

Filtered列

  • 表示返回的結果的行數佔需要讀取行數的百分比
  • Filtered列的值越大越好
  • Filtered列的值依賴的說統計信息

執行計劃的限制

  • 無法展示存儲過程,觸發器,udf對查詢的影響
  • 無法使用 explain對存儲過程進行分析
  • 早期版本的mysql只支持對select語句進行分析

 

轉載:https://www.cnblogs.com/nirao/p/9721964.html

 

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