explain(執行計劃),使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道MySQL是如何處理sql語句。explain主要用於分析查詢語句或表結構的性能瓶頸。
explain+sql ,通過執行explain可以獲得sql語句執行的相關信息。
下面我們就來逐一分析explain+sql得到的相關信息
1、id
它是一組數字,所表示的信息是select 語句操作表的順序,當id相同時,表執行順序從上至下,當id不同時,值越大執行優先級越高。
2、select_type
查詢的類型,主要用於區別普通查詢、聯合查詢、子查詢等複雜的查詢。其值主要有六個:
#1.SIMPLE 簡單的select查詢,查詢中不包含子查詢或union查詢。
#2.PRIMAR 詢中若包含任何複雜的子部分,最外層查詢爲PRIMARY,也就是最後加載的就是PRIMARY
#3.SUBQUERY 在select或where列表中包含了子查詢,就爲被標記爲SUBQUERY。
#4.DERIVED 在from列表中包含的子查詢會被標記爲DERIVED(衍生),MySQL會遞歸執行這些子查詢,將結果放在臨時表中。
#5.UNION 若第二個select出現在union後,則被標記爲UNION,若union包含在from子句的子查詢中,外層select將被標記爲DERIVED。
#6.UNION RESULT 從union表獲取結果的select。
3、table 顯示sql操作屬於哪張表的。
4、partitions 官方定義爲The matching partitions(匹配的分區),該字段應該是看table所在的分區吧(不曉得理解錯誤沒)。值爲NULL表示表未被分區。
5 type 表示查詢所使用的訪問類型,type的值主要有八種,該值表示查詢的sql語句好壞,從最好到最差依次爲:system>const>eq_ref>ref>range>index>ALL。
#1.system
表只有一行記錄(等於系統表),是const的特例類型,平時不會出現,可以忽略不計。
#2.const
表示通過一次索引就找到了結果,常出現於primary key或unique索引。因爲只匹配一行數據,所以查詢非常快。如將主鍵置於where條件中,MySQL就能將查詢轉換爲一個常量。
#3.eq_ref
唯一索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配。常見主鍵或唯一索引掃描。
#4.ref
非唯一性索引掃描,返回匹配某個單獨值的所有行。本質上也是一種索引訪問,返回匹配某值(某條件)的多行值,屬於查找和掃描的混合體。
#5.range
只檢索給定範圍的行,使用一個索引來檢索行,可以在key列中查看使用的索引,一般出現在where語句的條件中,如使用between、>、<、in等查詢。
#6.index
全索引掃描,index和ALL的區別:index只遍歷索引樹,通常比ALL快,因爲索引文件通常比數據文件小。雖說index和ALL都是全表掃描,但是index是從索引中讀取,ALL是從磁盤中讀取。
#7.ALL
全表掃描。
6.possible_keys
顯示可能應用在表中的索引,可能一個或多個。查詢涉及到的字段若存在索引,則該索引將被列出,但不一定被查詢實際使用。
7.key
實際中使用的索引,如爲NULL,則表示未使用索引。若查詢中使用了覆蓋索引,則該索引和查詢的select字段重疊。
8.key_len:表示索引中所使用的字節數,可通過該列計算查詢中使用的索引長度。在不損失精確性的情況下,長度越短越好。key_len顯示的值爲索引字段的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,並不是通過表內檢索出的。
9.ref
顯示關聯的字段。如果使用常數等值查詢,則顯示const,如果是連接查詢,則會顯示關聯的字段。
10.rows
根據表統計信息及索引選用情況大致估算出找到所需記錄所要讀取的行數。當然該值越小越好。
11.filtered
百分比值,表示存儲引擎返回的數據經過濾後,剩下多少滿足查詢條件記錄數量的比例。
12 Extra
#1.Using filesort
Using filesort表明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。
#2.Using temporary
使用了臨時表保存中間結果,常見於排序order by和分組查詢group by。非常危險,“十死無生”,急需優化。
#3.Using index
表明相應的select操作中使用了覆蓋索引,避免訪問表的額外數據行,效率不錯。
當出現Using filesort或者Using temporary表示sql語句存在嚴重問題,需要優化。