Mysql Explain語句詳解

一、Explain簡介:

  Explain是用來分析SQL語句的運行結果,通過該命令可以獲取一下信息:表的讀取順序,數據庫讀取操作的操作類型,哪些索引可以使用,實際使用了哪些索引,表之間的引用,每張表有多少行別優化器查詢等信息。

二、體驗Explain執行效果

EXPLAIN  SELECT
    e.*, 
    d. NAME AS deparment_name,
    d.id AS dpt_id,
    u.channel_id,
    u.id AS u_id
FROM
    employee e
LEFT JOIN department AS d ON e.dep_id = d.id
LEFT JOIN users AS u ON e.id = u.obj_id
WHERE
    (e.id = '146')
AND (e.flag = 1)
ORDER BY
    e.id DESC
LIMIT 1

這裏寫圖片描述

三、對Explain語句執行結果的每列進行說明

  1. id

      id列的編號是select的序列號,有幾個select就有幾個id,並且id的編號是按select出現的順序增長的。如果沒有出現derived等特殊語法,那麼explain的執行順序是按照從上到下來執行的。
      Mysql將select查詢分爲簡單查詢和複雜查詢。複雜查詢分爲三類:簡單子查詢,派生表(from語句中的子查詢)、union查詢

  2. select type:

      可以看執行實例,總共有以下幾種類型

    • SIMPLE:表示查詢不包含UNION或子查詢
    • PRIMARY:表示此查詢是最外層查詢
    • SUBQUERY:子查詢中的第一個SELECT
    • UINON:表示此查詢是UINON的第二或隨後的查詢
    • DEPENDEND UINON:UINON中第二個或後面的查詢,取決於外層的查詢
    • UINONR ESULT:從 union 臨時表檢索結果的 select
    • DEPENDEND SUBQUERY:子查詢的第一個SELEC,取決於外面的查詢,即子查詢依賴於外層的查詢結果
    • DERIVED:衍生,表示導出標的select(from子句的子查詢)
  3. table:

      表示查詢設計的表和衍生的表

  4. partitions:

      如果查詢是基於分區的話,會顯示查詢將訪問的分區

  5. type:

      該字段比較重要,它提供了判斷查詢是否高效的重要依據。通過該字段我們可以判斷此次查詢是全表掃描還是索引掃描等
      常用取值:

    • system:表中只有一條數據,這個類型是特殊的const類型
    • const:針對主鍵或唯一索引的等值查詢掃描,最多隻返回一條數據。const查詢速度非常快,因爲它僅僅 讀取一次即可
    • eq_ref:此類型通常出現在多表的join查詢,表示對於前表的每一個結果,都只能匹配到後表的一個結果並且查詢的比較操作通常是=,查詢效率較高。
    • ref:此類型通常出現在多表的join查詢,針對於非唯一或非主鍵索引,或者使用了最左前綴規則索引的查詢。
    • range:表示使用了索引範圍查詢,通過索引字段範圍獲取表中部分記錄。這個類型通常出現在=,<>,>,>=,<,<=,IS NULL,<=>,BETWEEN,IN()操作中。
    • index:表示全索引掃描(full index scan),和ALL類型類似,只不過ALL類型是全表掃描,而index類型則僅僅是掃描所有的索引,而不是掃描數據。index通常出現在:索要查詢數據直接在索引樹鍾就可以獲取得到,而不需要掃描數據,當時這種情況下extra字段會顯示Using index
    • ALL:表示全表掃描,性能是最差的。通常來說, 我們的查詢不應該出現ALL類型的查詢,因爲這樣的查詢在數據量大的情況下,對數據庫的性能是巨大的災難。 如一個查詢是 ALL 類型查詢, 那麼一般來說可以對相應的字段添加索引來避免。

      通常來說, 不同的 type 類型的性能關係如下:

    ALL < index < range ~ index_merge < ref < eq_ref < const < system

      ALL 類型因爲是全表掃描, 因此在相同的查詢條件下,它是速度最慢的。而 index 類型的查詢雖然不是全表掃描,但是它掃描了所有的索引,因此比 ALL 類型的稍快.後面的幾種類型都是利用了索引來查詢數據,因此可以過濾部分或大部分數據,因此查詢效率就比較高了。

  6. possible_keys:

      它表示在mysql查詢時,可能用到的索引。
      

    注意:即使有索引出現在possible_keys中出現,但並不表示此索引,真正的被mysql使用到。mysql使用了哪些索引,由key字段決定

  7. key:

      此字段是mysql查詢時真正使用到了索引。

  8. key_len:

      表示查詢優化器使用了索引字節數,這個字段可以評估組合索引是否完全被使用

  9. ref:

      這個表示顯示索引的那一列被使用了,如果可能的話是一個常量。前文type屬性裏與ref注意區別

  10. rows:

      該字段也是一個重要的字段,mysql查詢優化器根據統計信息,估算 sql 要查找到結果集需要掃描讀取的數據行數,這個值非常直觀的顯示sql效率好壞,原則上 rows 越少越好。

  11. extra:

      explain 中的很多額外的信息會在 extra 字段顯示, 常見的有以下幾種內容:

    • using filesort :表示 mysql 需額外的排序操作,不能通過索引順序達到排序效果。一般有 sing filesort都建議優化去掉,因爲這樣的查詢 cpu 資源消耗大。
    • using index:覆蓋索引掃描,表示查詢在索引樹中就可查找所需數據,不用掃描表數據文件,往往說明性能不錯。
    • using temporary:查詢有使用臨時表, 一般出現於排序, 分組和多表 join 的情況, 查詢效率不高,建議優化。
    • using where :表名使用了where過濾。

四、優化案例:

explain select * from orders where region_id=441900403

  執行結果,typeALL,並且沒有索引
這裏寫圖片描述

  開始優化,在region_id列上創建索引,明顯看到type列有ALL變成ref,並且用到了索引,rows也從450933行變成了16032
這裏寫圖片描述

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