explain或者desc擷取MySQL如何執行select語句的資訊。

1 各列字段說明
1.1 id
SELECT辨別符。這是查詢中SELECT的序列号,表示查詢中執行select子句或者操作表的順序。如果該行引用其他行的并集結果,則該值可為NULL。
id号分為三種情況:
- id相同,那麼執行順序從上到下
explain se1ect * from emp e join dept d on e.deptno = d.deptno
join salgrade sg on e.sa1 between sg.1osal and sg.hisal;
- id不同,如果是子查詢,id的序号會遞增,id值越大優先級越高,越先被執行
explain select * from emp e where e.deptno in
(select d.deptno from dept d where d.dname = 'SALES');
- id相同和不同的,同時存在:相同的可以認為是一組,從上往下順序執行,在所有組中,id值越大, 越先執行
exp1ain select * from emp e join dept d on e.deptno = d.deptno join salgrade sg on e.sa1
between sg.1osal and sg.hisal where e. deptno in (select d.deptno from dept d where
d.dname = 'SALES');
select_ type
1.2 select_type
區分SELECT的類型,是普通查詢還是聯合查詢還是子查詢:
- simple(簡單表,不用表連接配接或子查詢)
- primary(主查詢,外部查詢)
- union(union中的第二個或者後面的查詢語句)
- subquery(子查詢中的第一個select)
1.3 table
輸出結果集。對應行正在通路哪個表,表名或者别名,可能是臨時表或者union合并結果集。
如果是具體表名,則表明從實際的實體表中擷取資料,當然也可是表的别名
表名是derivedN的形式,表示使用了id為N的查詢産生的衍生表
當有union result時,表名是union n1,n2等的形式,n1,n2表示參與union的id
1.4 type
type列描述如何連接配接表。
表示MySQL在表中找到所需行的方式,或者叫
通路類型
。
常見類型:all,index,range,ref,eq_ref,const,system,null,性能由差到好。
一般需要保證查詢至少達到range級,最好能達到ref。
1.4.1 ALL
最簡單暴力的全表掃描,MySQL周遊全表找到比對行,效率最差。
對來自先前表的行的每個組合進行全表掃描。若該表是未标記為const的第一個表,則通常不好,并且在所有其他情況下通常性能也非常糟糕。
一般可以通過增加索引來避免ALL,這些索引允許基于早期表中的常量值或列值從表中檢索行。
explain select * from film where rating > 9;
1.4.2 index
連接配接類型與ALL相同,除了掃描索引樹外。這發生于兩種方式:
-
若索引是查詢的覆寫索引,并且可用于滿足表中所需的所有資料,則僅掃描索引樹
這種情況下,
列顯示Extra
。僅索引掃描通常比ALL更快,因索引大小通常小于表資料Using index
- 使用對索引的讀取執行全表掃描,以按索引順序查找資料行。Extra列不顯示
Using index
當查詢僅使用屬于單個索引一部分的列時,MySQL可以使用此連接配接類型。
explain select title from film;
1.4.3 range
使用索引查詢行,僅檢索給定範圍内的行。
key
列訓示使用的哪個索引。
key_len
包含使用的最長的鍵部分。
此類型的
ref
=
NULL
當使用
=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, or IN()
操作符将
key
列與常量進行比較時,可以使用range:
索引範圍掃描,常見<,<=,>,>=,between
SELECT * FROM tbl_name
WHERE key_column = 10;
SELECT * FROM tbl_name
WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name
WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name
WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
1.4.4 index_subquery
此連接配接類型類似于unique_subquery。它代替了
IN
子查詢,但适用于以下形式的子查詢中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
1.4.5 unique_subquery
此類型将eq_ref替換為以下形式的某些IN子查詢:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery隻是一個索引查找函數,可以完全替換子查詢以提高效率。