MySQL explain詳解

前言

MySQL提供explain關鍵字為我們提供語句SQL如何執行的信息,explain可用於 select,delete,insert,replace和update語句前。


select語句之前增加explain關鍵字,MySQL會在查詢上設置一個標記,使語句執行時只會返回select語句的執行計劃,但不執行select語句,使開發者可以根據執行計劃開發者可特定策略提高SQL語句性能。該文主要參考自MySQL官方文檔EXPLAIN Output Format。

explain返回結果列解析

id:標識SQL中的select執行順序

  • id相同時,查詢語句從上往下查詢
  • id不同時,id越大的執行優先級越高

select_type:查詢類型


MySQL explain詳解

table:執行的select查到是哪個表

partitions:查詢將匹配記錄的分區

type(access_type,重點):訪問(連接)類型,表示獲取所需數據行的方式

MySQL explain詳解

  • possible_keys:查詢中可能會被使用的索引
  • key:實際使用的索引
  • 注:key可能會命中possible_keys中不存在的索引

  • key_len:實際使用的索引列長度(如int列索引長度為4)
  • 若索引列允許NULL值,則該索引列長度比NOT NULL長度大1,如int類型索引列可空則使用該索引時key_len=5。varchar與char的實際長度會根據編碼類型更改,在utf8編碼環境下實際長度+2,可參考如下2圖:

    MySQL explain詳解

    ref(不常用):將哪些列或常量與該key列中命名的索引進行比較,以從表中選擇行。

    當為索引列等值判斷時該值為const;當為表間連接時則值為連接字段;當值為func,則使用的值是某些函數的結果,比較失敗則為null。

    rows:MySQL認為執行查詢必須檢查的行數

    InnoDB引擎下,該數值只是估計值,不一定準確

    filtered:將按表條件篩選的錶行的估計百分比

    最大值為100,意味著沒有發生行過濾(即都符合條件),值從100減少表示過濾量增加。如列rows=3,filtered=66.7%,則最後查詢出的列數約為2行,如(user_detail全量數據):

    MySQL explain詳解


    explain結果3 * 66.67約為2,如下圖(實際並不一定準確):

    MySQL explain詳解

    Extra:有關MySQL如何解析查詢的額外信息

    常見的如Using Where、Using Index、Distinct等

    explain只返回執行計劃不執行語句邏輯

    MySQL通過B+Tree查找規則找到數據所在的葉子頁獲取相關的Page Header、Page Dicectory等,便可得知所需數據大概有多少條,具體可參考 。如有錯誤,還請指出;如有不懂,以下參考:

    MySQL explain詳解


    分享到:


    相關文章: