mysql學習記錄 - explain命令

 

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

  1. idspa

    咱們上面執行select語句的順序號,固然若是對多個表進行分析它若是是一條sql裏面的,生成的id其實都是同樣的。這其實不重要,咱們只要知道只是個序列號就好了,固然若是該select是引用的其餘結果集的並集時,這是id爲會null.net

  2. 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

  3. table:就是select執行的表名,沒什麼好說的

  4. partitions:非分區表該字段爲null,能夠使用show table status from fescar命令查看Create_options字段

  5. 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:全表掃描

  6. 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

    從結果集看到列出了使用了的索引名稱

  7. key:展現mysql決定使用的索引名稱,上圖能夠看到該值爲PRIMARY

  8. key_len:選擇的密鑰的長度,若是key爲null,則該值爲null

  9. ref:顯示將哪些列或常量與鍵列中命名的索引進行比較以從表中選擇行。

  10. rows:匹配的行數

  11. filtered:經過where之類過濾後剩餘的數據

  12. Extra:其餘信息,好比上面的Using index之類的

對於explain的總結就這麼多了,下次記錄下真實場景下的explain調優實例,畢竟總歸要實踐才能體現價值。

相關文章
相關標籤/搜索