mysql中explain查看sql語句索引使用情況


explain + sql:

mysql> explain select * from user;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1  | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 5    |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+

1. id

  • 標志這個sql語句被分為幾個(行數)獨立的sql執行,執行順序依照(1)從大到小(2)從上到下 依次排列執行

 

2. select_type

查詢類型

 

+----+-------------+
| id | select_type | 
+----+-------------+
| 1 | SIMPLE       |
+----+-------------+
| 2 | PRIMARY      |
+----+-------------+
| 3 | SUBQUERY     |
+----+-------------+
| 4 | DERIVED      |
+----+-------------+
| 5 | UNION        |
+----+-------------+
| 6 | UNION RESULT |
+----+-------------+
  •   SIMPLE          簡單的select查詢,查詢中不包含子查詢或者UNION
  •   PRIMARY            查詢中包含子查詢,其中最外層查詢為PRIMARY
  •   SUBQUERY        別的查詢語句(select或where)中的子查詢
  •        DERIVED            在FROM列表中包含的子查詢被標記為DERIVED(衍生),MySQL會遞歸執行這些子查詢,把結果放在臨時表中 ,,,,臨時表!
  •        UNION                若第二個SELECT出現在UNION之后,則被標記為UNION:若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED
  •        UNION RESULT UNION的結果

3.table 

  • 表示當前行的子查詢設計的表

4.type

 表示查詢用到了那種索引類型

+-----+-------+-------+-----+--------+-------+---------+-------+
| ALL | index | range | ref | eq_ref | const | system  | NULL  | 
+-----+-------+-------+-----+--------+-------+---------+-------+

從最好到最差依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • system   表中只有一條記錄,一般來說只在系統表里出現。
  • const 表示通過一次索引查詢就查詢到了,一般對應索引列為primarykey 或者unique where語句中 指定 一個常量,因為只匹配一行數據,MYSQL能把這個查詢優化為一個常量,所以非常快。
  • eq_ref 唯一性索引掃描。此類型通常出現在多表的 join 查詢,對於每一個從前面的表連接的對應列,當前表的對應列具有唯一性索引,最多只有一行數據與之匹配。
  • ref 非唯一性索引掃描。同上,但當前表的對應列不具有唯一性索引,可能有多行數據匹配。此類型通常出現在多表的 join 查詢, 針對於非唯一或非主鍵索引, 或者是使用了 最左前綴 規則索引的查詢. 
  • range 索引的范圍查詢。查詢索引關鍵字某個范圍的值。
  • index 全文索引掃描。與all基本相同,掃描了全文,但查詢的字段被索引包含,故不需要讀取表中數據,只需要讀取索引樹中的字段。
  • all 全文掃描。未使用索引,效率最低。

5.key 和 possible key 與 key_len

  • possible key 表示 MySQL 在查詢時, 能夠使用到的索引. 注意, 即使有些索引在 possible_keys 中出現, 但是並不表示此索引會真正地被 MySQL 使用到. MySQL 在查詢時具體使用了哪些索引, 由 key 字段決定.
  • key 顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL。
  • key_len 顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度為NULL。 https://www.cnblogs.com/zhoujinyi/p/3784450.html
    • 覆蓋索引:指在查詢中,要查詢的字段被某個索引的所有字段包含,(type一般為index),那么這個索引只出現在key中,不出現在possible key中。

6.ref

  顯示索引的哪一列被使用了。

  •  ref 顯示使用哪個列或常數與key一起從表中選擇行。在eq_ref 與ref中才不為null。
  •  如果是使用的常數等值查詢,這里會顯示const,如果是連接查詢,被驅動表的執行計划這里會顯示驅動表的關聯字段,如果是條件使用了表達式或者函數,或者條件列發生了內部隱式轉換,這里可能顯示為func

7.rows

MySQL 查詢優化器根據統計信息, 估算 SQL 要查找到結果集需要掃描讀取的數據行數 這個值非常直觀顯示 SQL 的效率好壞, 原則上 rows 越少越好

8.extra

額外信息

  •  Using Filesort 表示對結果排序時無法使用索引,使用了一個臨時索引對結果排序。
  •  Using Temporary 在查詢中使用了臨時表保存中間結果。
  •  Using Index 表示使用了覆蓋索引(見5.) 如果同時出現了Using Where 表示索引被同時用來查找對應的鍵,若未出現,則僅僅用來讀取數據。
  •  Using Join Buffer 表示在查詢的時候 Join使用的非常多,使用了連接緩存,可以在配置文件中把緩沖區的join buffer調大一點。
  •  Using where 使用了where
  •  Impossible where where后的值總是false 比如 (...where i=1 and i=2)
  •  distinct 優化distinct操作,在找到第一匹配的元組后即停止找同樣值的動作

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM