1. 程式人生 > >MYSQL EXPLAIN 執行計劃詳解

MYSQL EXPLAIN 執行計劃詳解

explain的作用:

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。

EXPLAIN SELECT
    (
        SELECT
            c. NAME
        FROM
            fx_channel c
        WHERE
            c.id = s.channel_id
    ) ,
    SUM(s.total_cost) ,
    SUM(s.total_count) ,
    SUM(s.success_count)
FROM fx_analysis_channel_source s WHERE statistic_time >= '2017-01-20' AND statistic_time < '2018-01-20' GROUP BY s.channel_id HAVING SUM(s.total_count) > 0 ORDER BY SUM(s.total_cost) DESC

 

1. id

SELECT識別符。這是SELECT查詢序列號。查詢序號即為sql語句執行的順序。當id相同時,執行順序從上而下依次執行。
當ID 不同時,id的值越大,越優先執行。當id值有相同又有不同時,先是執行id值大的語句,然後在相同id中,從上而下依次執行。

 

2.select_type

表示查詢型別。

型別 描述
 simple  簡單查詢
 primary  最外面的select(雞蛋殼)
 union  union語句的第二個或者說是後面那一個
 subquery  在select或where列表中包含了子查詢
 derived  在FROM列表中包含的子查詢被標記為derived(衍生)MySQL會遞迴執行這些子查詢,把結果放在臨時表中
 dependent union  UNION中的第二個或後面的SELECT語句,取決於外面的查詢
 union result  UNION的結果


3.table

查詢時所用的表。

 

4.type

連線型別。有多個引數,先從最佳型別到最差型別介紹 重要且困難

型別 描述
 system (最佳)  表僅有一行,這是const型別的特列,平時不會出現,這個也可以忽略不計
 const(次之)  表最多有一個匹配行,const用於比較primary key 或者unique索引。因為只匹配一行資料,所以很快。
 eq_ref(次之)  唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃描。
 ref  非唯一性索引掃描,返回匹配某個單獨值得所有行,本質上也是一種索引訪問,它範湖所有匹配某個單獨值得行,然而,他可能會找到多個符合條件的行,所以他應該屬於查詢和掃描的混合體。
 range(次之)  只檢索給定返回的行,使用一個索引來選擇行,key列顯示使用了哪個索引,一般就是在你的where語句中出現了between、<、>、in等的查詢。這種範圍掃描索引比全表掃描要好,因為它只需要開始於索引的某個點,而結束於另一給點,不用掃描全部索引。
 index(次之)  該聯接型別與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引檔案通常比資料檔案小。(也就是說雖然all和Index都是讀全表,但index是從索引中讀取的,而all是從硬碟中讀的)當查詢只使用作為單索引一部分的列時,MySQL可以使用該聯接型別。
 ALL(最差)  對於每個來自於先前的表的行組合,進行完整的表掃描。如果表是第一個沒標記const的表,這通常不好,並且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基於前面的表中的常數值或列值被檢索。

 

5.possible_keys

顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的欄位若存在索引,則該索引將被列出。但不一定被查詢實際使用。

 

6.keys

MYSQL實際使用的索引.如果為NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引和查詢的select欄位重疊。

 

7.key_len

MYSQL使用的索引長度。
在不損失精確性的情況下,長度越短越好

 

8.ref

顯示索引的那一列被使用了。如果可能的話,是一個常數。哪些列或常量被用於查詢索引列上的值

 

9.rows

顯示MYSQL執行查詢的行數,一般情況下,越小越好

 

10.Extra

該列包含MySQL解決查詢的詳細資訊。

型別 描述
 Distinct  MySQL發現第1個匹配行後,停止為當前的行組合搜尋更多的行。
 range checked for each record  沒有找到合適的索引
 using filesort  檔案排序,說明mysql會對資料使用一個外部的索引排序,而不是按照表內的索引進行讀取。
 using index  是否使用了索引
 using temporary  表示使用了臨時表,如果出現這個,則必須優化。
 using where  表示使用了條件查詢
 Using sort_union(…), Using union(…),Using intersect(…)  說明如何為index_merge聯接型別合併索引掃描
 Using index for group-by  類似於訪問表的Using index方式,Using index for group-by表示MySQL發現了一個索引,可以用來查詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜尋硬碟訪問實際的表。並且,按最有效的方式使用索引,以便對於每個組,只讀取少量索引條目。

通過相乘EXPLAIN輸出的rows列的所有值,你能得到一個關於一個聯接如何的提示。這應該粗略地告訴你MySQL必須檢查多少行以執行查詢。當你使用max_join_size變數限制查詢時,也用這個乘積來確定執行哪個多表SELECT語句。