author:zxwhtml
email:502513206@qq.commysql
@ Jishou University sql
1.前言
最近買了mysql的一個課程,基本已經看完第一輪了,第一輪只是留個印象在腦海中還不算深刻的理解,想一想最近好久沒寫過博客了,恰好來記錄下學習的理解以及加深印象。數據庫
2.Content
有關explain官方是這樣解釋的,explain提供mysql如何執行語句的信息,能夠和select,delete,insert,replace,update命令一塊兒使用。ide
The
EXPLAIN
statement provides information about how MySQL executes statements: 學習
explain select * from news
咱們在數據庫中執行該條sql語句獲得執行信息以下,順帶一提mysql每行輸出都提供一個表的信息,若是你連表查詢則下面就會多幾行優化
看着參數不少好像徹底記不住的樣子,不要怕,下面列一個表格對每個列進行完整的解釋,完全拿下這行表格含義。url
-
idspa
咱們上面執行select語句的順序號,固然若是對多個表進行分析它若是是一條sql裏面的,生成的id其實都是同樣的。這其實不重要,咱們只要知道只是個序列號就好了,固然若是該select是引用的其餘結果集的並集時,這是id爲會null.net
-
select_type
就是咱們select語句的類型,select_type的類型一共有11種,不一一列出,就挑幾個常見的來看
-
SIMPLE:簡單查詢,意思就是沒有使用union的sql
-
PRIMARY:最外層的sql
-
UNION:UNION中的第二個或者更下層的sql
咱們執行以下sql
EXPLAIN (select acct.id,ot.id from account_tbl as acct,order_tbl as ot where acct.user_id = ot.user_id and acct.user_id = 'U100000' limit 0,1 ) union all (select acct.id,ot.id from account_tbl as acct,order_tbl as ot where acct.user_id = ot.user_id and acct.user_id = 'U100000' limit 0,1)
獲得的結果集以下,能夠看到select_type爲primary和union,能夠看到第一個select被標註爲PRIMARY意思是最外層的sql,而union下面的sql則被標註爲union
-
-
table:就是select執行的表名,沒什麼好說的
-
partitions:非分區表該字段爲null,能夠使用
show table status from fescar
命令查看Create_options字段 -
type:連接類型,這個是咱們關注的重點字段
-
system:系統表,const類型連接的特例。
-
const:常量級查詢,速度很是快。對主鍵或者惟一索引進行匹配時當作常量處理
explain select * from storage_tbl where commodity_code = 'C100000' and id= 21
獲得以下結果
-
eq_ref:除了先前兩種類型最好的一種,當咱們使用表連接操做時,若是鏈接使用的是主鍵索引或者非空的惟一索引時,就會產生該類型
explain select * from storage_tbl,test where storage_tbl.commodity_code = test.name
結果集以下
-
ref:若是索引不是主鍵或者非空惟一索引類型,則會產生此type
-
fulltext:全文索引
-
ref_or_null:若是使用了isNull
-
index_merge:索引合併優化
-
unique_subquery:使用in語句
-
range:當咱們對索引使用範圍查詢時
-
index:僅掃描索引樹
sql:
explain select storage_tbl.id from storage_tbl,test where storage_tbl.commodity_code = 'C100000'
這邊進行了一個連表查詢,而且僅對錶一進行匹配,最後的結果以下咱們對錶2是沒有進行匹配操做的,因此表二是走了整個索引樹的查詢,type爲index,因此index類型實際上就是索引全掃描。若是你不想索引全掃描則能夠加where判斷條件
-
all:全表掃描
-
-
possible_keys
列出sql語句中使用到的索引
sql:
explain select storage_tbl.id,storage_tbl.commodity_code from storage_tbl where storage_tbl.id = 21 and storage_tbl.commodity_code = 'C100000'
這裏我有兩個索引,id、commodity_code從結果集看到列出了使用了的索引名稱
-
key:展現mysql決定使用的索引名稱,上圖能夠看到該值爲PRIMARY
-
key_len:選擇的密鑰的長度,若是key爲null,則該值爲null
-
ref:顯示將哪些列或常量與鍵列中命名的索引進行比較以從表中選擇行。
-
rows:匹配的行數
-
filtered:經過where之類過濾後剩餘的數據
-
Extra:其餘信息,好比上面的Using index之類的
對於explain的總結就這麼多了,下次記錄下真實場景下的explain調優實例,畢竟總歸要實踐才能體現價值。