MySQL Explain學習筆記


繼上一篇博客《MySQL的索引知識學習筆記》之后,我再記錄一篇MySQL執行計划方面的博客,本博客是我在學習尚硅谷的學習教程后,做的筆記,當然我不是為了所謂宣傳,僅僅是學習記錄的筆記。本來可以不分享出來,不過,分享出來的筆記不僅可以給網上的學習者參考學習,同時寫在csdn比較方便,可以支持圖片上傳,也方便自己以后查找復習,本博客CSDN版:鏈接

附錄:我創建的數據庫方面的專欄

一、執行計划概念

執行計划(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操作,在查到對一條記錄后,就不查找相同的記錄

四、案例學習

  • 復雜點的案例
    來自視頻教程的案例
    在這里插入圖片描述
    尚硅谷教師的歸納
    在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM