天天看點

實戰講解MySQL的expain執行計劃,面試官當場要了我(上)1 各列字段說明

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

實戰講解MySQL的expain執行計劃,面試官當場要了我(上)1 各列字段說明
結果包含很多列

1 各列字段說明

1.1 id

SELECT辨別符。這是查詢中SELECT的序列号,表示查詢中執行select子句或者操作表的順序。如果該行引用其他行的并集結果,則該值可為NULL。

id号分為三種情況:

  1. 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;      
  1. id不同,如果是子查詢,id的序号會遞增,id值越大優先級越高,越先被執行
explain select * from emp e where e.deptno in 
    (select d.deptno from dept d where d.dname = 'SALES');      
  1. 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相同,除了掃描索引樹外。這發生于兩種方式:

  1. 若索引是查詢的覆寫索引,并且可用于滿足表中所需的所有資料,則僅掃描索引樹

    這種情況下,

    Extra

    列顯示

    Using index

    。僅索引掃描通常比ALL更快,因索引大小通常小于表資料
  2. 使用對索引的讀取執行全表掃描,以按索引順序查找資料行。Extra列不顯示

    Using index

當查詢僅使用屬于單個索引一部分的列時,MySQL可以使用此連接配接類型。

explain select title from film;      

1.4.3 range

使用索引查詢行,僅檢索給定範圍内的行。

key

列訓示使用的哪個索引。

key_len

包含使用的最長的鍵部分。

此類型的

ref

=

NULL

實戰講解MySQL的expain執行計劃,面試官當場要了我(上)1 各列字段說明

當使用 

=, <>, >, >=, <, <=, 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隻是一個索引查找函數,可以完全替換子查詢以提高效率。

繼續閱讀