天天看點

MySQL 使用explain分析sql語句的查詢效率(一)未完待續~

mysql explain用于分析sql 語句的執行及資料庫索引的使用。本文将緻力于幫助大家充分了解explain所傳回的各項參數,進而使大家快速掌握explain用法技巧。如果你在看其他教程或視訊後仍覺得雲裡霧裡。那麼請通讀本文。

用法

explain的用法相當簡潔,直接在sql語句前加上EXPLAIN 即可,例如:

EXPLAIN
select * FROM ec_stores_info where stores_id = 
           

本語句将傳回:

MySQL 使用explain分析sql語句的查詢效率(一)未完待續~

每行将得到id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra幾個參數。

其中與效率息息相關的則是type,key,ref,rows。

下面依次解析以上所有參數:

參數解析

id,select_type,table 用于定位查詢,表示本行參數所對應的sql查詢部分:

(1)id

SELECT識别符。這是SELECT的查詢序列号。不重要,需要注意的是,不要把id當成執行順序,這并不準确。

(2)select_type

SELECT類型,可以為以下幾種:

  1. SIMPLE: 訓示非子查詢和union的簡單查詢。
  1. PRIMARY: 訓示在有子查詢的語句中最外面的select,主查詢。
    MySQL 使用explain分析sql語句的查詢效率(一)未完待續~
  2. UNION: 訓示在使用union語句的第二個或後面的select。
    MySQL 使用explain分析sql語句的查詢效率(一)未完待續~
  3. DEPENDENT UNION: 子查詢union語句的第二個或後面的select。
  4. UNION RESULT : union語句的結果集。
    MySQL 使用explain分析sql語句的查詢效率(一)未完待續~
  5. SUBQUERY:子查詢中的語句。與union相反了解就行了。
  6. DEPENDENT SUBQUERY:子查詢中第一個語句。
    MySQL 使用explain分析sql語句的查詢效率(一)未完待續~
  7. DERIVED:派生表的SELECT(FROM子句的子查詢)。
    MySQL 使用explain分析sql語句的查詢效率(一)未完待續~

(3)table

就是表名,本行記錄對應查詢所應用的表。可以通過table表名幫助定位查詢。

使用explain時,有時table字段顯示的并不是表名,而是 derived2 或 derived3 等等。。。

即 derived x 代表的是id為x的查詢所得的結果集。例如:

EXPLAIN 
SELECT so.storeorder_id,so.storeorder_sn,si.stores_name
from ec_stores_order so
INNER JOIN 
(SELECT stores_id,stores_name from ec_stores_info where stores_creatorid=) si 
on so.store_id=si.stores_id

           

explain後所得:

MySQL 使用explain分析sql語句的查詢效率(一)未完待續~

由以上内容可知,id為2的記錄對應inner join後的子查詢1,第一條記錄所對應的table參數值derived2即為子查詢1的結果集。

案例

為幫助大家了解,請看2個案例:

(1)

EXPLAIN
SELECT o.storeorder_id,o.storeorder_sn,i.stores_name 
from ec_stores_order o 
INNER JOIN ec_stores_info i 
on o.store_id = i.stores_id
           

本例中沒有子查詢,是以explain後将傳回兩條簡單查詢記錄

MySQL 使用explain分析sql語句的查詢效率(一)未完待續~

兩條select_type均為SIMPLE,第一條table 為o 即 stores_order表的代号,是以判定第一條的參數為join前半段在stores_order表中檢索資料的過程,第二條則是通過store_id在stores_info表中擷取stores_name的過程。

(2)

将上例中sql語句改寫成如下等效sql:

EXPLAIN
SELECT o.storeorder_id,
o.storeorder_sn,(SELECT stores_name from ec_stores_info where stores_id=o.store_id) as stores_name 
from ec_stores_order o
           

本條sql與上條sql效果相同,但是加入了子查詢,故而傳回參數與上個案例完全不同:

MySQL 使用explain分析sql語句的查詢效率(一)未完待續~

select_type為DEPENDENT SUBQUERY的記錄毫無疑問就是括号内的子查詢部分喽,另一條PRIMARY的記錄對應的當然就是主查詢 select … from ec_stores_order o啦~

未完待續~

下一篇将繼續講解其他與效率相關的參數,敬請期待~