mysql explain中的列

參考:《高性能mysql》附錄D EXPLAIN mysql

MySql將Select查詢分爲簡單和複雜類型,複雜類型分爲3大類:簡單子查詢,所謂的派生表(在派生表的子查詢),以及UNION查詢。sql

列與其介紹

id

  該列包含一個編號,標識SELECT所屬的行。服務器

select_type

  該列顯示了對應行是簡單仍是複雜的select(若是是後者,那麼是三種複雜類型中哪種)。性能

  simple:查詢不包括子查詢和UNION。優化

  primary:若是查詢有任何複雜的子部分,則最外層標記爲primary。spa

  subquery:包含在select列表中的子查詢中的select(換句話說,不在from子句中)標記爲subquery。code

      derived:用來標識包含在from子句的子查詢中的select,mysql會遞歸執行並將結果放到一個臨時表中。服務器稱其爲派生表,由於該表是從子查詢派生而來的。blog

  union:在union中的第二個和隨後的select被標記爲union。第一個select被標記就好像它以部分外查詢來執行。排序

  union result:用來從union匿名臨時表檢查結果的select被標記爲union result。遞歸

table

  顯示了對應行正在訪問那個表。在一般狀況下,它就是那個表,或是該表的別名。

type

  訪問類型---mysql決定如何查找表中的行。(從差到優)

  all:全表掃描,一般意味着Mysql必須掃描全表,從頭至尾,去找到須要的行。(這裏有個例外,在查詢中使用了limit,或者在extra列中顯示‘Using distinct/not exists’)。

  index:這個和全表掃描同樣,只是mysql掃描表時按索引次序進行而不是行。它的主要優勢是避免了排序;最大的缺點就是要承擔按索引次序讀取整個表的開銷。這一般意着如果按照隨機次序訪問行,開銷將會很是大。若是在extra列中看到‘using index’,說明MySql正在使用覆蓋索引,它只掃描索引的數據,而不是按索引次序的每一行。它比按索引次序全表掃描的開銷要少得多。

  range:範圍掃描就是一個有限制的索引掃描,它開始於索引的某一點,返回匹配這個值域的行。它比全索引好一些,由於它不用遍歷所有索引。顯而易見的範圍掃描是帶有between或在where子句裏帶有>的查詢。

  ref:這是一種索引訪問(有時也叫作索引查找),它返回全部匹配某個單個值的行。然而,它可能會找到多個符合條件的行,所以,它是查找和掃描的混合體。此類索引訪問只有當使用非惟一性索引或者惟一性索引的非惟一性前綴時纔會發生。把它叫作ref是由於索引要跟某個參考值相比較。這個參考值或者是一個常數,或者是來自多表查詢錢一個表裏的結果值。 ref-null是ref之上的一個變體,它意味着MySql必須在楚辭查找的結果裏進行第二次查找以找出NULL條目。

  eq-ref:MySql知道最多隻返回一條符合條件的記錄。這種訪問方法能夠在MySql使用主鍵或者惟一性索引查找時看到,它會將它們與某個參考值做比較。MySQL對於這類訪問類型的優化作的很是好,由於它知道無需估計匹配行的範圍或在匹配行後再繼續查找。

explain select tb_order.*,tb_user.username from tb_order INNER JOIN tb_user on tb_order.user_id = tb_user.id

結果:

 

  const,system:當MySql能對查詢的某部分進行優化並將其轉換成一個常量時,它就會使用這些訪問類型。舉例來講,若是你將某一行的主鍵放入where子句裏的方式來選取此行的主鍵,mysql就能把這個查詢轉化爲一個常量。經常使用於primary key 和 unique 索引的查詢。

       null:這種訪問方式意味着MySql能在優化階段分解查詢語句,在執行階段甚至用不着再訪問表或者索引。例如,從一個索引列裏選取最小值能夠經過單獨查找索引來完成,不須要再執行時訪問表。

possible_keys 

  這一列顯示了查詢可使用哪些索引,這是基於查詢訪問的列和使用的比較操做符來判斷的。這個列表是在優化過程的早期建立的,所以有些羅列出來的索引可能對於後續優化過程是沒用的。

key

  這一列顯示了MySql決定採用哪一個索引來優化對該表的訪問。若是該索引沒有出如今possible_keys列中,那麼MySql選用它是出於另外的緣由---例如,它可能選擇了一個覆蓋索引,哪怕沒有where 子句。

  possible_keys揭示了哪個索引能有助與高效地行查找,而key顯示的是優化採用哪個索引能夠最小化查詢成本。

key_len

  該列顯示了MySql在索引裏使用的字節數。

ref

  顯示使用哪一個列或常數與key一塊兒從表中選擇行。

rows

  顯示MySQL認爲它執行查詢時必須檢查的行數。這個數字是內嵌循環關聯計劃裏的循環數目。也就是說它不是MySql認爲它最終要從表裏讀取出來的行數,而是MySql爲了找到符合查詢的每一點上標準的那些行而必須讀取的行的平均數。

fitered

  顯示的是針對表裏符合某個條件(where子句或聯接條件)的記錄數的百分比所作的一個悲觀估算。把rows列和這個百分比相乘,就能看到MySql估算它將和查詢計劃裏前一個表關聯的行數。 

extra

  這一列包含的是不適合在其餘列顯示的額外信息。

  • Using index:使用覆蓋索引,以免訪問表。
  • Using where:在存儲引擎檢索行後再進行過濾。許多where條件裏涉及索引中的列,當MySql服務器讀取索引時,就能被存儲檢驗,所以不是有帶Where子句的查詢都會顯示「Using Where」。
  • Using temporary:對查詢結果排序時會使用一個臨時表。
  • Using filesort:MySql會對結果使用過一個外部索引排序,而不是按索引次序從表裏讀取行。
  • range checked for each record (index map: N):這個值意味着沒有好用的索引,新的索引講再聯接的每一行是上從新估算。N是顯示在possible_keys列中索引的位圖,而且是冗餘的。
相關文章
相關標籤/搜索