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