在生產項目中,總有需要分析sql性能的時候,看看自己寫的sql慢在哪裏,那就需要用到explan關鍵字來進行分析,那什麼是explain,下面就來分析一下。
一、什麼是explain?
使用explain關鍵字可以模擬優化器執行SQL查詢語句,從而知道MYSQL是如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸。它的語法就是:explain + sql語句。它能做很多事情,比如:表的讀取順序;數據讀取操作的操作類型;哪些索引可以使用;哪些索引被實際使用;表之間的引用;每張表有多少行被優化器查詢。
二、執行計劃信息
執行計劃包含如下信息:
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
2.1、id字段
select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序。
有三種情況:1)id相同,執行順序由上至下;2)如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行;3)id如果相同,可以認爲是一組,從上往下順序執行。
2.2、select_type
simple |
簡單的select查詢,查詢中不包含子查詢或者UNION |
primary |
查詢中若包含任何複雜的子部分,最外層查詢則被標記爲primary |
subquery |
在select或where列表中包含了子查詢 |
derived |
在from列表中包含的子查詢被標記爲DERIVED(衍生)MYSQL會遞歸執行這些子查詢,把結果放在臨時表裏。 |
union |
若第二個select出現在union之後,則被標記爲union:若union包含在from子句的子查詢中,外層select將被標記爲:derived |
union result |
從union表獲取結果的select |
2.3、table(操作表)
2.4、type
顯示的是訪問類型,較爲重要的一個指標,結果值從最好到最壞依次是:
system > const > eq_ref > ref > range > index > ALL。
system:表只要一行記錄(等於系統表),這是const類型的特例,平時不會出現,這個也可以忽略不計。
const:表示通過索引依次就找到了,const用於比較primary key或者unique索引。因爲只匹配一行數據,所以很快如將主鍵置於where列表中,MYSQL就能將該查詢轉換爲一個常量。
eq_ref:唯一索引掃描,對於每個索引建,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃描
range:只檢測給定範圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。一般就是在你的where語句中出現了between、<、>、in等的查詢。這種範圍掃描索引掃描比全表掃描要好,因爲它只需要開始於索引的某一點,而結束於另一點,不用掃描全部索引。
index:Full Index Scan,index與All區別爲index類型只遍歷索引樹。這通常比ALL快,因爲索引文件通常比數據文件小。(也就是說雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬盤中讀的)
all:Full table scan,將遍歷全表以找到匹配的行。
備註:一般來說,得保證查詢至少達到range級別,最好能達到ref。
2.5、possible_keys
顯示可能應用到這張表中的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用。
2.6、key
實際使用的索引,如果爲NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引僅出現在key列表中。
2.7、key_len
表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好。key_len顯示的值爲索引字段的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的。
2.8、ref
顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用於查找索引列上的值。
2.9、rows
根據表統計信息以及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數,越小越好。
2.10、extra
包含不適合在其他列展示但是又很重要的額外信息。
Using filesort |
說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。Mysql中無法利用索引完成的排序操作稱爲"文件排序"。 |
explain select driver_id, punish_type, status from risk_asset_sill_punish where id < 50 * 2 order by create_time desc ; |
Using temporary |
使用了臨時表保存中間結果,MySQL在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by。 |
explain select col1 from t1 where col1 in ('a', 'b','c') group by col2; 索引:idx_col1_col2 |
Using Index |
表示相應的select操作中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率不錯。如果同時出現了using where,表明索引被用來執行索引鍵值的查找;如果沒有同時出現using where,表明索引用來讀取數據而非執行查找動作。 |
|
Using where |
使用了where條件 |
|
Using join buffer |
使用了連接緩存 |
|
impossible where |
不可能的條件 |
|
select tables optimized away |
||
distinct |
Author:憶之獨秀
Email:[email protected]
轉載註明出處:https://blog.csdn.net/lavorange/article/details/103330618