概述 explain 關鍵字可以模擬執行 sql 查詢語句,輸出執行計劃,分析查詢語句的執行性能 使用方式如下:explain + sql explain select * from t1 執行計劃各欄位含義 1. id 如果 id 序號相同,從上往下執行 如果 id 序號不同,序號大先執行 如果兩 ...
概述
explain 關鍵字可以模擬執行 sql 查詢語句,輸出執行計劃,分析查詢語句的執行性能
使用方式如下:explain + sql
explain select * from t1
執行計劃各欄位含義
1. id
- 如果 id 序號相同,從上往下執行
- 如果 id 序號不同,序號大先執行
- 如果兩種都存在,先執行序號大,在同級從上往下執行
- 如果顯示 NULL,最後執行,表示結果集,並且不需要使用它來進行查詢
2. select_type
表示查詢的類型,取值有如下:
SIMPLE:簡單的 select 查詢,不包含子查詢或者 UNION
PRIMARY:複雜查詢中最外層查詢,比如使用 union 或 union all 時,id 為 1 的記錄 select_type 通常是 primary
SUBQUERY:指在 select 語句中出現的子查詢語句,結果不依賴於外部查詢(不在 from 語句中)
DEPENDENT SUBQUERY:指在 select 語句中出現的查詢語句,結果依賴於外部查詢
DERIVED:derived 稱為派生表,在 FROM 子句的查詢語句,表示從外部數據源中推導出來的,而不是從 SELECT 語句中的其他列中選擇出來的
UNION:若第二個 SELECT 出現在 UNION 之後,則被標記為 UNION;若 UNION 包含在 FROM 子句的子查詢中,那麼第一個 SELECT 將被標記為 DERIVED
UNION RESULT:UNION 的結果
DEPENDENT UNION:當 union 作為子查詢時,其中第一個 union 為 dependent subquery,第二個 union 為 dependent union
3. table
表示當前行正在訪問的表
4. type
表示查詢使用的類型,性能由好到壞依次是:system > const > eq_ref > ref > range > index > all
,一般來說能達到 range 級別,最好能達到 ref 級別
system:表只有一行(相當於系統表),是 const 類型的特例
const:針對主鍵或唯一索引的等值查詢掃描,只返回一行數據
eq_ref:基於主鍵或唯一索引連接兩個表,對於每個索引鍵值,只有一條匹配記錄,被驅動表的類型為 eq_ref,這種類型只出現在 join
ref:非唯一性索引掃描,返回匹配多個符合條件的行
range:範圍掃描,檢索指定範圍的行,一般出現在 where 語句出現 between、< 、>、in 等的查詢
index:只遍歷索引樹即可找到匹配的數據,比如下例中 user_id 就是 orders 表的索引
all:遍歷全表找到匹配的數據
5. possible_keys
顯示可能使用到的索引,實際不一定被使用
6. key
實際使用的索引
7. key_len
索引使用的位元組數,可通過該列計算查詢中使用的索引的長度,主要用於聯合索引
比如現有 users 表,執行以下 sql,該表有為 name 和 email 欄位設置聯合索引 index_name_email
explain select * from users where name = "張三" and email = "[email protected]"
執行結果如下:
users 表結構如下:
name 和 email 欄位都為 varchar,一個字元占 3 個位元組,所以 key_len = 50 * 3 + 2 + 1 + 100 * 3 + 2 = 455,其中 varchar 需要額外占用 2 個位元組,允許 NULL 值額外占用 1 個位元組
據此我們可以得知 index_name_email 中的 name 和 email 欄位都被使用了
8. ref
表示哪些列或常量被用於匹配用到的索引
9. rows
根據表統計信息及索引選用情況,估算出找到所需的記錄所需要讀取的行數,值越小越好,它不是結果集中的行數
10. filtered
表示某個表經過條件過濾之後,剩餘記錄條數的百分比
11. Extra
包含一些重要的額外信息
Using index:出現索引覆蓋,即查詢和檢索條件的列都在使用的索引裡面,不需要回表
Using where:不通過索引查詢需要的數據
下例中 total_price 欄位不存在索引
Using index condition:表示查詢列不被索引覆蓋,where 條件中是一個索引範圍查找,過濾完索引後回表找到所有符合條件的數據行
Using filesort:當查詢包含排序操作,又無法利用索引完成排序操作時,數據較少在記憶體排序,數據較多則在磁碟排序
Using temporary:在做如去重、排序和分組等功能時,如果不能有效利用索引,就需要建立臨時表來完成