2019年6月25日 星期二

【MYSQL】EXPLAIN - 欄位說明解釋


EXPLAIN - 欄位說明解釋
mysql> explain select * from PROCESSLIST;
+----+------------+------+------------+------+--------------+----+---------+----+-----+--------+-------+
| id | select_type| table| partitions | type | possible_keys| key| key_len | ref| rows|filtered| Extra |
+----+------------+------+------------+------+--------------+----+---------+----+-----+--------+-------+
1 row in set, 1 warning (0.00 sec)

欄位及欄位值說明
【id】 : 此數字表示執行select 操作表的順序,id越大最優先123的順序就是321
  • 情況1:id相同,執行順序由上至下
  • 情況2:id不同,如果是子查詢,id的序號會遞增,id值越大優先執行
  • 情況3:id相同與不同都有,可認為是同一組,從上往下順序執行,id值越大則優先執行
【select_type】:
  • SIMPLE:簡單查詢,查詢中不含子查詢或UNION
  • PRIMARY:查詢中若包含任何複雜的子部份,最外層的查詢則被標記為primary
  • SUBQUERY:在select或where列表中包含子查詢
  • DERIVED:衍生表,在FROM列表中包含的子查詢被標記為DERIVED,MYSQL會將歸類這些子查詢,於臨時表中
  • UNION:若第二個SELECT出現在UNION之後,則標記為UNION,若UNION包含FROM子句的子查詢中,外層的SELECT將被標示為DERIVED
【table】:使用哪一張表
【type】:

  • ALL:Full table scan,將全表以找到匹配的行
  • index:Full index scan,index與 ALL區別為index類型只找索引列,比ALL快因為索引文件通常比數據文件小(也就是ALL與INDEX都是讀全表,但INDEX是從索引中讀取的,而ALL是從硬碟中讀的)
  • range:只檢查給定範圍的行,使用一個索引來選擇行,KEY列顯示使用了哪個索引,一般就是在你的where語句中出現between、>、<、in等的查詢,這種範圍掃描索引掃描比全表掃描要好,因為它只需要開始於索引的某一點至結束點,不用掃描全部索引
  • ref:非唯一性索引掃描,返回匹配某個單獨值的所有行(多筆),本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬於查找和掃描的混合體
  • eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配,常見於主鍵或唯一索引掃描
  • const:表示通過索引一次就找到了,const用於比較primary key或者unique索引。因為只匹配一行數據,所以很快如將主鍵置於where列表中,MYSQL就能將該查詢轉換成一個常量
  • system:表只有一行記錄,這是CONST類型的特列,平時不會出現,這個也可能忽略不計
優→差system>const>eq_ref>ref>range>index>ALL

【 possible_keys】:顯示可能應用在這張表中的索引,一個或多個,查詢結果字段若存索引,則該索引將被列出(但不一定被查詢實際使用到)

【key】:實際使用的索引,如果為NULL 則沒有使用索引
【key_len】:表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好,key_len顯示的值為索引字段的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的
【ref】:顯示索引的哪一列被使用了,如果可能的話,是一個常數,哪些列或常量被用於查找索引列上的值
【rows】根據表統計信息及索引選用情況,大致估算出找到所需記錄讀取的行數
【extra】:包含不適合在其他列中顯示,但十分重要的額外信息

  • using filesort (文件內排序):說明MYSQL 會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取,MYSQL中無法利用索引完成的排序操作稱為"文件排序",(不用索引去排,用文件去排)
  • using temporary:使用了臨時表保存中間結果,MYSQL 在對查詢結果排序時使用臨時表,常見於排序order by 和分組查詢group by
  • using index:表示相應的select 操作使用了覆蓋索引,避免訪問了表的數據行,效率不錯,如果同時出現using where,表示索引被用來執行索引鍵值的查找;如果沒有出現 using where,表示索引用來讀取數據而不是執行查找動作。
  • using where:表示使用了WHERE過濾
  • using join buffer:表示用了連接緩存
  • impossible where:WHERE 子句的值如果一直是FALSE,不能用來獲取任何元組
  • select tables optimized away:沒有在GROUP BY 子句的情況下,基於索引優化MIN/MAX操作或者對於MYISAM存儲引擎優化COUNT(*)操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化
  • distinct:優化DISTINCT操作,在找到第一匹配的元組後即停止找同樣值的動作
*左連結JEFT JOIN 條件用於確定如何建立右邊索引

沒有留言:

張貼留言