【MySQL】Explain字段的解釋

      網友投稿 853 2025-04-04

      Explain命令是查看查詢優化器是如何決定執行查詢的主要方法。這個功能有局限性,并不總會說出真相,但它的輸出是可以獲取的最好信息,值得花時間去了解,因為可以學習到查詢是如何執行的。學會解釋explain將會幫助你了解MySQL優化器是如何工作的。

      Explain誤區跟不足

      在執行Explain時MySQL不會執行查詢,這是一個誤區。事實上查詢中包括子查詢,那么MySQL實際上會執行子查詢,將其結果放在一個臨時表中,然后完成外層的查詢優化。

      雖然我們調用explain可以分析sql語句,但要意識到分析出來的結果也是一個近似結果,別無其他。

      explain不會告訴你觸發器,存儲過程如何影響查詢

      他不會告訴你mysql在查詢執行中所做的特定優化

      他不會顯示關于查詢的執行計劃的所有信息

      他并不區分具有相同名字的事物。例如,他對內存排序和臨時文件都使用filesort,并且對于磁盤上和內存中的臨時表都顯示using temporary

      可能會誤導。例如,他會對一個有著很小limit的查詢顯示全索引掃描

      explain列的解釋

      id列

      這一列總是包含一個編號,標識select所屬的行。如果在語句當中沒有子查詢活聯合查詢,那么就只會有唯一的select,于是每一行在這個列中都將顯示一個1。否則,內層的select語句一般會順序編號,對應于其在原始語句的位置

      select_type列

      這一列顯示了sql語句是簡單的查詢還是復雜的查詢。

      簡單查詢顯示的simple,如果有子查詢或者聯合查詢則是primary

      SUBQUERY

      包含在SELECT列表中的子查詢中的SELECT(換句話說,不 在FROM子句中)標記為SUBQUERY。

      DERIVED

      DERIVED值用來表示包含在FROM子句的子查詢中的SELECT, MySQL會遞歸執行并將結果放到一個臨時表中。服務器內部稱 其“派生表”,因為該臨時表是從子查詢中派生來的。

      UNION

      在UNION中的第二個和隨后的SELECT被標記為UNION。第一 個SELECT被標記就好像它以部分外查詢來執行。這就是之前的例子 中在UNION中的第一個SELECT顯示為PRIMARY的原因。如果UNION被 FROM子句中的子查詢包含,那么它的第一個SELECT會被標記 為DERIVED。

      UNION RESULT

      用來從UNION的匿名臨時表檢索結果的SELECT被標記為UNION RESULT。

      除了這些值,SUBQUERY和UNION還可以被標記為DEPENDENT和 UNCACHEABLE。DEPENDENT意味著SELECT依賴于外層查詢中發現的數 據;UNCACHEABLE意味著SELECT中的某些特性阻止結果被緩存于一 個Item_cache中。(Item_cache未被文檔記載;它與查詢緩存不是一回 事,盡管它可以被一些相同類型的構件否定,例如RAND()函數。)

      table列

      顯示這一步所訪問的數據庫中的表的名稱。

      type列

      這是最重要的字段之一,顯示查詢使用了何種類型。從最好到最差的連接類型依次為:

      system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL

      system

      系統表,表中只有一行數據

      const

      讀常量,最多只會有一條記錄匹配,由于是常量,實際上只需要讀一次。

      eq_ref

      最多只會有一條匹配結果,一般是通過主鍵或唯一鍵索引來訪問

      ref

      對于來自前面表的每一行,在此表的索引中可以匹配到多行。若聯接只用到索引的最左前綴或索引不是主鍵或唯一索引時,使用ref類型(也就是說,此聯接能夠匹配多行記錄)。

      ref可用于使用’=‘或’<=>'操作符作比較的索引列。

      fulltext

      使用全文索引的時候是這個類型。要注意,全文索引的優先級很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引

      ref_or_null

      跟ref類型類似,只是增加了null值的比較。實際用的不多。

      eg. SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;

      1

      2

      3

      index_merge

      表示查詢使用了兩個以上的索引,最后取交集或者并集,常見and ,or的條件使用了不同的索引,官方排序這個在ref_or_null之后,但是實際上由于要讀取多個索引,性能可能大部分時間都不如range

      unique_subquery

      用于where中的in形式子查詢,子查詢返回不重復值唯一值,可以完全替換子查詢,效率更高。

      該類型替換了下面形式的IN子查詢的ref:

      【MySQL】Explain字段的解釋

      value IN (SELECT primary_key FROM single_table WHERE some_expr)

      index_subquery

      子查詢中的返回結果字段組合是一個索引(或索引組合),但不是一個主鍵或唯一索引

      range

      索引范圍查詢,常見于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等運算符的查詢中。

      index

      索引全表掃描,把索引從頭到尾掃一遍

      all

      全表掃描,性能最差。

      partitions

      該列顯示的為分區表命中的分區情況。非分區表該字段為空(null)。

      possible_keys

      查詢可能使用到的索引都會在這里列出來

      key

      優化器從possible_keys中選擇使用的索引。

      key_len

      查詢用到的索引長度(字節數)。key_len只計算where條件用到的索引長度,而排序和分組就算用到了索引,也不會計算到key_len中。

      ref

      如果是使用的常數等值查詢,這里會顯示const,如果是連接查詢,被驅動表的執行計劃這里會顯示驅動表的關聯字段,如果是條件使用了表達式或者函數,或者條件列發生了內部隱式轉換,這里可能顯示為func

      rows(重要)

      rows 也是一個重要的字段。 這是mysql估算的需要掃描的行數(不是精確值)。

      這個值非常直觀顯示 SQL 的效率好壞, 原則上 rows 越少越好.

      filtered

      這個字段表示存儲引擎返回的數據在server層過濾后,剩下多少滿足查詢的記錄數量的比例,注意是百分比,不是具體記錄數。這個字段不重要

      extra

      EXplain 中的很多額外的信息會在 Extra 字段顯示, 常見的有以下幾種內容:

      . using index : 出現這個說明mysql使用了覆蓋索引,避免訪問了表的數據行,效率不錯。

      . using where :這說明服務器在存儲引擎收到行后講進行過濾。

      . using temporary :這意味著mysql對查詢結果進行排序的時候使用了一張臨時表

      . using filesort :這個說明mysql會對數據使用一個外部的索引排序

      注意當出現using temporary 和 using filesort時候說明需要優化操作

      MySQL SQL

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:第一個python 程序
      下一篇:MINA(米娜桑)
      相關文章
      亚洲国产理论片在线播放| 亚洲资源在线视频| 亚洲成_人网站图片| 亚洲蜜芽在线精品一区| 西西人体44rt高清亚洲| 亚洲A∨无码一区二区三区| 亚洲av综合色区| 亚洲av成人无码久久精品| 久久精品7亚洲午夜a| 亚洲综合婷婷久久| 亚洲视频一区二区在线观看| 亚洲视频免费播放| 91嫩草亚洲精品| 亚洲黄页网在线观看| 亚洲深深色噜噜狠狠网站| 中文有码亚洲制服av片| 亚洲码和欧洲码一码二码三码| 亚洲人成人伊人成综合网无码| 亚洲国产区男人本色| 国产亚洲精品91| 亚洲午夜爱爱香蕉片| 亚洲va中文字幕无码久久 | 免费亚洲视频在线观看| 亚洲AV无码乱码在线观看| 中文字幕亚洲一区二区三区| 亚洲无人区午夜福利码高清完整版| 亚洲色无码一区二区三区| 亚洲国产天堂在线观看| 亚洲精品午夜视频| 亚洲avav天堂av在线网爱情| 亚洲日本VA午夜在线影院| 国产精品成人亚洲| 国产亚洲精品无码专区| 亚洲国产精品一区二区久久hs| 亚洲资源在线观看| 精品亚洲成A人无码成A在线观看 | 亚洲欧洲日产国码无码久久99 | mm1313亚洲国产精品无码试看| 亚洲国产av一区二区三区| 亚洲热妇无码AV在线播放| 亚洲va在线va天堂va888www|