Mysql之explain

explain

  1. 是什麼:使用explain關鍵字可以模擬優化器執行sql語句,從而知道MYsqlShi 如何處理我們的SQL語句的。分析我們的查詢語句或者表結構的性能瓶頸

  2. 能幹嘛

    1. 表的讀取順序

    2. 數據讀取操作的操作類型

    3. 哪些索引可以使用

    4. 哪些索引被實際使用

    5. 表之間的引用

    6. 每張表有多少行被優化器查詢

  3. 怎麼玩

    1. Explain+SQL語句

    2. 執行計劃包含的信息

      1. id

        1. select查詢的序列號,包含一組數字,表示查詢中執行select子句或者表的順序

        2. 三種情況

          1. id相同,順序由上至下

          2. id不同,如果子查詢,id序列號會遞增,Id越大優先級越高,越先別執行

          3. id相同不同,同時存在

      2. select _type

        1. 有哪些值:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT

        2. 作用:主要是用於區別普通查詢、聯合查詢、子查詢等的複雜查詢

        3. 詳解

          1. SIMPLE:簡單是select查詢,查詢中不包含子查詢或者UNION

          2. PRIMARY:查詢中若包含任何複雜的子部分,最外層查詢則被標記爲PRIMARY

          3. SUBQURY:在select或者where列表中包含了子查詢

          4. DERIVED:在from列表中包含的子查詢被標記爲DERIVED(衍生),Msql會遞歸執行這些子查詢,把結果放在臨時表中

          5. UNION:若第二個select出現在union之後則被標記爲union;若union包含在from中,外層select將被標記爲DERIVED

          6. UNION RESULT:從UNION表中獲取結果的select

      3. table:顯示這行一行的數據是關於哪張表的

      4. type

        1. type的值:ALL、index、range、ref、eq_ref、const、system、NULL

        2. 詳解

          1. system:表只有一行記錄(等於系統表),這是const類型的特例,平時不會出現

          2. const:表示通過索引一次就找到了,const用於比較primary key或者unique索引。因爲只匹配一行數據,所以很快,如將主鍵置於where列中,Mysql就能將該查詢轉換爲一個常量

          3. eq_ref:唯一性索引掃描,對於每一個索引鍵,表中只有一條記錄與之匹配,常見於主鍵或者唯一索引掃描

          4. ref:非唯一索引掃描,返回某個單獨值的所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而他可能找到多個符合條件的行,所以他屬於查找和掃描的混合體

          5. range:只檢索給定指定範圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引,一般就是在where語句中出現between、<、>、in等的查詢

          6. index:Full Index Scan,index與ALL區別爲index類型只遍歷索引數。這通常比ALL快,因爲索引文件通常比數據文件小(也就是說index和ALL都是讀全表,而ALL是從硬盤中讀的)

          7. ALL:Full Table Scan,將遍歷全表以找到匹配的行

        3. 訪問類型排序:最好到最差(system>const>eq_ref>ref>range>index>ALL )一般來說,得保證查詢最少達到range界別,最好能達到ref

      5. possible_keys

        1. 顯示可能應用在這張表的索引,一個或者多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但是不一定被查詢實際使用

      6. key

        1. 實際使用 的索引。如果爲NULL則沒有使用索引

        2. 查詢中若使用 了覆蓋索引,則該索引僅出現在key列表中

      7. key_len

        1. 表示索引中使用的字節數,可通過該列計算查詢中使用索引的長度。在不損失精確度的情況下,長度越短越好

        2. 顯示的值爲索引字段的最大可能長度,並非實際使用長度,即key_len是根據表計算而得,不是通過表內檢索得來的

      8. ref

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

      9. rows

        1. 根據表統計信息及索引選用情況,大致估算出找到記錄所需要讀取的行數

      10. Extra

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

          1. Using filesort:說明Mysql會對數據使用一個外部的索引排序,而不是按照表內的索引數據進行讀取。Mysql中無法利用索引完成的排序操作稱爲"文件排序"(一旦初夏這種情況會非常麻煩)

          2. Using temporary:使用了臨時表保存中間結果,Mysql在對查詢結果排序時使用臨時表,常見於排序order by和分組查詢group by.(如果遇到這種情況,立刻處理)

          3. Using index:(出現這個是非常好的現象)表示相應的select操作中使用了覆蓋索引,避免訪問了表的數據行,效率不錯。如果同時出現using where ,表明索引索引被用來執行索引鍵值的查找;如果沒有同時出現using where,表明索引用來讀取數據而非執行查找動作

          4. Using where:表明使用了where過濾

          5. using join buffer:使用了連接緩存

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

          7. select tables optimized away:在沒有Group BY子句的情況下,基於索引優化MIN/MAX操作或者對於MyISAM存儲優化引擎優化count(*)操作,不必等到執行階段再去進行計算,查詢執行生成的階段即完成優化

          8. distinct:優化distinct操作,在找到第一匹配的元組後即停止找同樣值的操作

        2. 總結:在上面的8中信息中,重點關注前三個

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章