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操作,在找到第一匹配的元組后即停止找同樣值的動作
