【Mysql】Explain關鍵字分析SQL性能

      在生產項目中,總有需要分析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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章