sql優化系列之explain執行計劃

關於explain執行計劃,這些知識點,你不得不知道,否則你怎麼敢說你做過sql調優呢???

explain 用處

當explain和sql一起使用時,mysql會顯示來自優化器關於sql執行的信息。也就是說,mysql會解釋它將如何處理該sql語句,包括是否會使用索引,可能使用到的索引,以及最終使用的索引,錶鏈接及順序等等。所以學會查看explain執行計劃非常重要。

explain所有字段

總的來說,explain包含如下字段:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、extra共12個字段

explain各字段含義

  • id

    • 標示查詢中執行select子句或操作表的順序,id的值越大,代表優先級越高,越先執行。(1)id都相同,則表示多個表具有同樣的優先級,執行順序由上而下,(2)id不同,如果sql中存在子查詢,那麼id的序號會遞增,id越大優先級越高越先被執行,當多表依次嵌套,發現最裏層的子查詢id最大,最先執行。
  • select_type

    • 表示查詢的類型,主要用於區分各種複雜的查詢,例如:普通查詢、聯合查詢、子查詢等。
    • SIMPLE: 表示最簡單的select查詢語句,也就是查詢中不包括子查詢或者union等。
    • PRIMARY: 當查詢語句中包含任何複雜的子部分,最外層的查詢被標記爲PRIMARY
    • SUBQUERY: 當select或where列表中包含了子查詢,該子查詢被標記爲SUBQUERY
    • 另外還有 DERIVED、UNION、UNION RESULT
  • table

    • 查詢的表名字,並不一定是真實存在的表,有別名顯示別名,也可能爲臨時表。
  • partitions

    • 查詢時匹配到的分區信息,對非分區表值爲NULL,當查詢分區表時,partitions顯示分區表命中的分區情況。
  • type

    • 查詢使用了何種類型,它是一項重要指標,性能從好到壞依次是: system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > All
    • system: 當表只有一行記錄時,數據量很少,往往不需要磁盤io,速度非常快。
    • const:查詢命中primary key主鍵或者unique唯一索引,或者被連接的部分是一個常量值,這類掃描效率極高,返回數據量少,速度非常快。
    • eq_ref:查詢時命中primary key主鍵或者unique key索引,type就是eq_ref。
    • ref: 區別於eq_ref,ref表示使用非唯一索引,會找到很多個符合條件的記錄。
    • ref_or_null:這種連接類型類似於ref,區別在於mysql會額外搜索包含null的行。
    • index_merge:使用了索引合併優化方法,查詢使用了兩個以上的索引。
    • range: 在where語句中使用between and、> 、< 、in 等條件查詢type都是range
    • index: index和all其實都是讀取全表,區別在於index是便利索引樹,而all是從硬盤中讀取。
    • all :遍歷全表,性能最差。
  • possible_keys

    • 查詢可能會使用到的索引,但並不一定是最終查詢時真正使用的索引。
  • key:區別於possible_keys, key時查詢時實際使用到的索引,若沒有使用索引,顯示爲null

  • key_len

    • 表示查詢用到的索引長度即字節數,原則上長度越短越好。
  • ref:

    • 常見的有:const, func,null,字段名。當使用常量等職查詢時顯示const,當使用關聯查詢時,會顯示關聯表的關聯字段,如果查詢使用了函數、隱士轉換、表達式等顯示爲func,其他情況爲null
  • rows

    • 查詢到我們需要的數據需要讀區的行數, 值越小越好
  • filtered

    • 這個時一個百分比的值,表示符合條件的記錄數的百分比。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章