1. 程式人生 > 資料庫 >Mysql Explain命令筆記

Mysql Explain命令筆記

Mysql Explain命令筆記

用法

EXPLAIN <SQL語句>
EXPLAIN SELECT * FROM TBL_TEST WHERE ID=123;
使用explain命令可以檢視某個SQL語句的執行過程,檢視該SQL是否有用到索引,使用索引的方式,有沒有作全表掃描,排序的時候有沒有使用臨時表等,對於SQL優化點的排查有很好的幫助。

輸出

±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+
| 1 | SIMPLE | TBL_TEST | ref | KEY_COL1_COL2 | KEY_COL1_COL2 | 206 | const,const | 1 | Using index condition |
±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+

  1. id為sql的執行順序,由大到小,上到下的順序執行
  2. select_type有以下幾種型別:
    (1) SIMPLE
    簡單SELECT(不使用UNION或子查詢等) 例如:
    (2). PRIMARY
    最外層的select
    (3).UNION
    UNION中的第二個或後面的SELECT語句
    EXPLAIN SELECT * FROM TBL_TEST WHERE ID=123 UNION ALL SELECT * FROM TBL_TEST;
    ±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    ±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | 1 | PRIMARY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    | 2 | UNION | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | |
    ±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    (4).DEPENDENT UNION
    UNION中的第二個或後面的SELECT語句,取決於外面的查詢
    EXPLAIN SELECT * FROM TBL_TEST WHERE ID IN (SELECT ID FROM TBL_TEST UNION ALL SELECT ID FROM TBL_TEST);
    ±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    ±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    | 1 | PRIMARY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    | 2 | DEPENDENT SUBQUERY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    | 3 | DEPENDENT UNION | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
    ±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
    (4).UNION RESULT
    UNION的結果。
    (5).SUBQUERY
    子查詢中的第一個SELECT.
    (6). DEPENDENT SUBQUERY
    子查詢中的第一個SELECT,取決於外面的查詢
    (7).DERIVED
    派生表的SELECT(FROM子句的子查詢)
  3. table欄位,操作的表名
  4. type欄位,這個欄位很關鍵,用於闡述當前查詢是屬於哪種型別,是否使用索引、使用索引範圍,連線型別為從好到差依次為:const>eq_ref>ref>range>index>ALL
    system: 表只有一行或者為空
    const: 使用唯一索引或者主鍵,返回記錄一定是一條的等值where條件時,通常type是const
    eq_ref: 使用唯一索引或者主鍵,此型別通常出現於多表的join查詢,表示對於前表的每一個結果,都對應後表的唯一一條結果。並且查詢的比較是等值操作,查詢效率比較高。
    ref可能找到多個符合條件的行,有三種情況:
    1. 非主鍵或者唯一鍵的等值查詢
    2. join連線欄位是非主鍵或者唯一鍵
    3. 最左字首索引匹配
      range: 索引範圍掃描,常用於><,is null,between,in,like等
      index:掃描全表索引,通常比All快一些
      ALL:全表掃描,沒有使用索引
  5. possible_keys欄位,顯示select可能會使用的列
  6. key欄位,此次查詢所用到的索引key,沒有則為NULL
  7. key_len欄位,該查詢計算使用的索引長度,在不損失精度情況下長度越短越好。key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,並不是通過表內檢索出的。
  8. ref欄位,這一列顯示了在key列記錄的索引中,表查詢值所用到的列或常量,常見的有: const(常量),欄位名等。一般是查詢條件或關聯條件中等號右邊的值,如果是常量那麼ref列是const,非常量的話ref列就是欄位名。
  9. row欄位,表明此次查詢過程中需要讀取並檢測的行數
  10. Extra欄位,額外資訊
    Using index——只掃面索引可以直接得到結果(結果集欄位是索引)
    Using index condition——查詢的列索引不完全覆蓋(結果集的欄位不全是索引)
    Using where——索引只用來執行定位,結果集需要查詢對應資料行
    Using temporary——結果需要建立臨時表處理,此類查詢特別消耗資源
    Using filesort——排序使用外部排序,並不在記憶體中,此類排序效率很低消耗大量IO