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操作,在查到對一條記錄後,就不查詢相同的記錄
四、案例學習
- 複雜點的案例
來自視訊教程的案例
尚矽谷教師的歸納