下面以mysql數據庫爲例,在運行沒有問題的sql語句前面加上EXPLAIN
列名 | 中文說明 |
---|---|
id | SELECT標識符 |
select_type | SELECT類型 |
table | 表名 |
partitions | 匹配的分區 |
type | 聯接類型 |
possible_keys | 可能的索引選擇 |
key | 實際選擇的索引 |
key_len | 用到索引的長度 |
ref | 索引被用於拿一列 |
rows | 預計要檢查的行 |
filtered | 按表條件過濾的行百分比 |
Extra | 附加信息 |
一、Type
-
system
只有一條數據的系統表或者衍生表只有一條數據的主查詢 -
const
僅僅能查到一條數據的sql,用於Primary key 或unique索引(類型與索引類型有關) -
eq_ref
唯一性索引,對於每個索引鍵的查詢,返回匹配唯一行數據(有且只有1個,不能多、不能0)
常見於唯一索引和主鍵索引 -
ref
非唯一性索引,對於每個索引鍵的查詢,返回匹配的所有行(0,多) -
fulltext
使用FULLTEXT索引執行連接。 -
ref_or_null
這種連接類型類似於ref,但是MySQL額外搜索包含NULL值的行。 此聯接類型優化最常用於解析子查詢。 -
index_merge
此聯接類型指示使用索引合併優化。 在這種情況下,輸出行中的鍵列包含使用的索引列表,而key_len包含使用的索引的最長鍵部分的列表。 -
unique_subquery
此類型將eq_ref替換爲以下形式的某些IN子查詢:value IN (SELECT primary_key FROM single_table WHERE some_expr)
只是一個索引查找函數,可以完全替換子查詢以提高效率。
-
index_subquery
此連接類型類似於unique_subquery。 它代替了IN子查詢,但適用於以下形式的子查詢中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
-
range
檢索指定範圍的行,where後面是一個範圍查詢 (between,>,<, 特殊的in) -
index
查詢全部索引中的數據 -
all
查詢全部表中的數據
PS:
- system,const只是理想情況
- 實際達到:ref>range
- 上面的5-8很少見到
- 上面的十二個從上到下性能逐漸降低
參考文件:
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-join-types