日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL之Explain

發布時間:2023/12/18 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL之Explain 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

目錄

?

Explain是什么

Explain能做什么

?Explain怎么用

?Explain名詞解釋


Explain是什么

使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸。

Explain能做什么

  • 表的讀取順序
  • 哪些索引可以使用
  • 數據讀取操作的操作類型
  • 哪些索引被實際使用
  • 表之間的引用
  • 每張表有多少行被物理查詢

?Explain怎么用

Explain + SQL語句

?Explain名詞解釋

id

select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序;id號每個號碼,表示一趟獨立的查詢。一個sql 的查詢趟數越少越好。?

  • id相同,執行順序由上至下。 id相同,執行順序由上至下
  • id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行。 id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行
  • id相同不同,同時存在 id相同不同,同時存在 id如果相同,可以認為是一組,從上往下順序執行;在所有組中,id值越大,優先級越高,越先執行;衍生 = DERIVED。

select_type?

查詢的類型,主要是用于區別普通查詢、聯合查詢、子查詢等的復雜查詢。

  • SIMPLE:簡單的 select 查詢,查詢中不包含子查詢或者UNION。?

  • PRIMARY:查詢中若包含任何復雜的子部分,最外層查詢則被標記為Primary。

  • ?DERIVED:在FROM列表中包含的子查詢被標記為DERIVED(衍生);MySQL會遞歸執行這些子查詢, 把結果放在臨時表里。

  • SUBQUERY:在SELECT或WHERE列表中包含了子查詢。

  • DEPENDENT SUBQUERY:在SELECT或WHERE列表中包含了子查詢,子查詢基于外層?。

  • UNCACHEABLE SUBQUREY
  • UNION:若第二個SELECT出現在UNION之后,則被標記為UNION;若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED。

  • UNION RESULT:從UNION表獲取結果的SELECT。

  • table

    顯示這一行的數據是關于哪張表的

    partitions

    代表分區表中的命中情況,非分區表,該項為null

    type

    type顯示的是訪問類型,是較為重要的一個指標,結果值從最好到最壞依次是:?
    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL?

    system>const>eq_ref>ref>range>index>ALL
    一般來說,得保證查詢至少達到range級別,最好能達到ref。

  • system:表只有一行記錄(等于系統表),這是const類型的特列,平時不會出現,這個也可以忽略不計。
  • const:表示通過索引一次就找到了,const用于比較primary key或者unique索引。因為只匹配一行數據,所以很快
    如將主鍵置于where列表中,MySQL就能將該查詢轉換為一個常量。

  • ?eq_ref:唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或唯一索引掃描。

    ?

  • ref:非唯一性索引掃描,返回匹配某個單獨值的所有行;本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,
    它可能會找到多個符合條件的行,所以他應該屬于查找和掃描的混合體。
  • range:只檢索給定范圍的行,使用一個索引來選擇行。key 列顯示使用了哪個索引。一般就是在你的where語句中出現了between、<、>、in等的查詢這種范圍掃描索引掃描比全表掃描要好,因為它只需要開始于索引的某一點,而結束語另一點,不用掃描全部索引。

  • ?index:出現index是sql使用了索引但是沒用通過索引進行過濾,一般是使用了覆蓋索引或者是利用索引進行了排序分組。

  • all:Full Table Scan,將遍歷全表以找到匹配的行。

  • index_merge:在查詢過程中需要多個索引組合使用,通常出現在有 or 的關鍵字的sql中。

  • ref_or_null:對于某個字段既需要關聯條件,也需要null值得情況下。查詢優化器會選擇用ref_or_null連接查詢。

  • index_subquery:利用索引來關聯子查詢,不再全表掃描。

  • unique_subquery :該聯接類型類似于index_subquery。 子查詢中的唯一索引。

  • 備注:一般來說,得保證查詢至少達到range級別,最好能達到ref。

    ?possible_keys

    顯示可能應用在這張表中的索引,一個或多個。

    查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用。

    ?key

    實際使用的索引。如果為NULL,則沒有使用索引。

    查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊

    key_len?

    表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。?

    key_len字段能夠幫你檢查是否充分的利用上了索引。

    ref?

    顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用于查找索引列上的值。

    ref示例

    ?

    rows?

    rows列顯示MySQL認為它執行查詢時必須檢查的行數。

    越少越好。?

    filtered?

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

    ?Extra

    包含不適合在其他列中顯示但十分重要的額外信息。?

  • Using filesort:?說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。MySQL中無法利用索引完成的排序操作稱為“文件排序”。

  • ?Using temporary:使了用臨時表保存中間結果,MySQL在對查詢結果排序時使用臨時表。常見于排序 order by 和分組查詢 group by。

  • ?USING index:表示相應的select操作中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率不錯!如果同時出現using where,表明索引被用來執行索引鍵值的查找;如果沒有同時出現using where,表明索引只是用來讀取數據而非利用索引執行查找。利用索引進行了排序或分組。
  • Using where:表明使用了where過濾。
  • using join buffer:使用了連接緩存。

  • ?impossible where:where子句的值總是false,不能用來獲取任何元組。

  • ?select tables optimized away:在沒有GROUPBY子句的情況下,基于索引優化MIN/MAX操作或者對于MyISAM存儲引擎優化COUNT(*)操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化。
  • ?

    參考:http://www.atguigu.com/download_detail.shtml?v=30#player

    總結

    以上是生活随笔為你收集整理的MySQL之Explain的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。