MYSQL EXPLAIN 執行計劃詳解
阿新 • • 發佈:2018-11-29
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語句。