1. 程式人生 > >MySQL Explain學習筆記

MySQL Explain學習筆記

目錄

  • 一、執行計劃概念
  • 二、Explain用法
  • 三、Explain屬性介紹
    • 3.1 id屬性
    • 3.2 select_type屬性
    • 3.3 table屬性
    • 3.4 type屬性
    • 3.5 possible_keys屬性
    • 3.6 key屬性
    • 3.7 key_len屬性
    • 3.8 ref屬性
    • 3.9 rows屬性
    • 3.10 Extra屬性
  • 四、案例學習

繼上一篇部落格《MySQL的索引知識學習筆記》之後,我再記錄一篇MySQL執行計劃方面的部落格,本部落格是我在學習尚矽谷的學習教程後,做的筆記,當然我不是為了所謂宣傳,僅僅是學習記錄的筆記。本來可以不分享出來,不過,分享出來的筆記不僅可以給網上的學習者參考學習,同時寫在csdn比較方便,可以支援圖片上傳,也方便自己以後查詢複習,本部落格CSDN版:連結

附錄:我建立的資料庫方面的專欄

  • SQL調優方面的專欄
  • MySQL知識方面的專欄

一、執行計劃概念

執行計劃(Explain):explain顯示了mysql如何使用索引來處理select語句以及連線表,使用Explain關鍵字可以模擬MySQL優化器執行SQL查詢語句,從而知道MySQL是如何處理SQL語句的。所以執行計劃常用於SQL調優

二、Explain用法

Explain的用法:

  • Explain + SQL語句
mysql> explain select * from sys_user;

mysql> use jeeplatform;
Database changed
mysql> explain select * from sys_user;
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | r
ows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
|  1 | SIMPLE      | sys_user | ALL  | NULL          | NULL | NULL    | NULL |
  4 |       |
+----+-------------+----------+------+---------------+------+---------+------+--
----+-------+
1 row in set (0.00 sec)

mysql>

Explain的主要屬性有id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,如何對這些屬性進行比較詳細的介紹

三、Explain屬性介紹

執行計劃(Explain)包括如下屬性:

比較重要的屬性有id、type、key、rows、Extra

3.1 id屬性

id屬性其實就是顯示了SQL的執行順序,下面分類解釋

  • id相同的情況

id相同的情況,執行順序由上到下

本例子來自尚矽谷教程介紹,從執行計劃可以看出就是t1>t3>t2,因為SQL有t1.other_column=''的條件,所以先從t1開始執行,然後是t3,接著是t2

  • id不同的情況
    id不同的情況,根據id優先順序來看,優先順序越高越先執行
  • id相同不同同時存在
    這種是比較特殊的情況,不過還是按照優化先看,然後id相同的情況,還是按照從上到下的情況看

3.2 select_type屬性

select_type就是查詢的型別,用來區別普通查詢、聯合查詢(union)、子查詢等複雜查詢,屬性分為:

  • 1、Simple
    簡單select查詢,查詢中不包括子查詢、聯合查詢等
  • 2、PRIMARY
    PRIMARY可以理解為主查詢,當然是在包括子查詢等情況下面,最外面的查詢被稱之為PRIMARY查詢
  • 3、SUBQUERY
    SUBQUERY就是子查詢,一般用於select後面或者where條件後面

  • 4、DERIVED
    DERIVED是衍生查詢,一般用於from後面查詢返回一個衍生表
  • 5、UNION
    UNION是聯合查詢,UNION或者UNION ALL關鍵字後面的查詢表查詢都被標記為聯合查詢
  • 6、UNION RESULT
    union result就是從union獲取的查詢結果

3.3 table屬性

table屬性,很顯然這個屬性就是顯示查詢資料是關於哪張表的

3.4 type屬性

type屬性表示MySQL找到資料行採取的方式,也稱之為訪問方式,顯示了查詢使用了何種型別

訪問型別排序,從最好到最差的依次是(常用的):
system>const>eq_ref>ref>range>index>All

來自尚矽谷老師的歸納:

然後介紹一下這些級別

  • ststem
    表只有一條記錄的情況,顯示type為system,這種一般在系統表才會出現,是const的一種特例
  • const
    const常量,一般用於where條件後面,用於比較主鍵索引或者唯一索引,索引一次就可以找到一條記錄,一般返回一個常量
  • eq_ref
    唯一性索引掃描,一般是主鍵Primary key或者唯一索引(union index),只返回一條記錄與之匹配
  • ref
    非唯一性索引掃描,也是一種索引訪問,不過符合的記錄有多條
  • range
    索引返回掃描,一般來說在where條件出現了between或者<、>、in等符合或者關鍵字就是索引訪問掃描,不過建了組合索引,有些情況是會導致索引失效的
  • index
    index也就是索引全掃描(full index scan),index和all的區別是:index掃描所有索引,all掃描所有資料,在mysql中,索引檔案是比檔案小,所以index掃描效能是比all好的
  • All
    all也是全表掃描,不建索引的情況,經常出現全表掃描(full table scan)

備註:要保證sql查詢,一般要達到range,或者ref級別

3.5 possible_keys屬性

用於顯示理論上掃描可能用到的索引

3.6 key屬性

用於顯示實踐上用到的索引,返回null表示沒用到索引

3.7 key_len屬性

表示索引使用的位元組數,key_len顯示的是索引欄位最大的可能長度,並非實際使用的長度

3.8 ref屬性

ref屬性用於顯示哪些常用或者列被用於查詢索引,前提條件是走索引的

3.9 rows屬性

rows資料是根據統計資訊及索引選用情況,大致估算出的記錄數

3.10 Extra屬性

Extra可以理解為拓展或者額外的屬性,包含了不在其它屬性的資訊,但是十分重要的額外資訊,常用於分析定位效能問題,比較重要的屬性有Using filesort、using temporary、using index

  • 1、Using filesort
    Extra資訊顯示這個資訊說明無法利用索引完成排序order by,而選擇了檔案排序,這種情況是比較耗效能的,所以要看看索引失效的原因

    如圖來自尚矽谷視訊的例子,這裡就出現了Extra資訊為using filesort,原因是where條件裡用了col1,order by後面只用了col3,而複合索引是3個列都建的,所以導致不能用到索引排序,用了檔案排序代替,解決方法是在order by加上col2

備註:索引的兩大作用:排序和查詢

  • 2、using temporary
    出現這個資訊表示,使用了臨時表儲存中間結果,出現原因是在對查詢結果排序時使用了臨時表,常見與order by和group by一起用的情況

    上面例子,就是using temporary的情況,在group by後面加上col2列,使索引能用得上

  • 3、Using index
    出現using index說明出現覆蓋索引(Covering index),是效率不錯的!如果using where也一起出現,說明索引被用來查詢,只有一個說明只用來讀取資料

    覆蓋索引(Covering index),一說索引覆蓋,意思是查詢時,資料只要從索引獲取就可以(從葉子節點獲取),不需要讀取資料行
    注意:查詢時,要使用索引覆蓋,就要select的列表只取需要的列就可以,不可以select * ,如果將所有的欄位一起做索引會導致索引檔案過大,影響查詢效能

  • Using where
    表示使用了where過濾條件
  • Using join buffer
    表示使用了連線快取,也就是內外連線
  • Impossible where
    where子句的查詢結果總是false,不能用來獲取任何元組
  • Select table optimized away
  • Distinct
    使用了distinct操作,在查到對一條記錄後,就不查詢相同的記錄

四、案例學習

  • 複雜點的案例
    來自視訊教程的案例

    尚矽谷教師的歸納