MySQL之explain詳細講解

前言:這篇文章主要講explain如何使用,還有explain各類參數概念

1、Explain用法

Explain + SQL語句;程序員

如:Explain select * from user;web

會生成以下SQL分析結果,下面詳細對每一個字段進行詳解spring

2、id

是一組數字,表明多個表之間的查詢順序,或者包含子句查詢語句中的順序,id總共分爲三種狀況,依次詳解sql

  • id相同,執行順序由上至下

  • id不一樣,若是是子查詢,id號會遞增,id值越大優先級越高,越先被執行

  • id相同和不一樣的狀況同時存在

3、select_type

select_type包含如下幾種值數據庫

  • simple
  • primary
  • subquery
  • derived
  • union
  • union result

 simple

簡單的select查詢,查詢中不包含子查詢或者union查詢緩存

primary

若是SQL語句中包含任何子查詢,那麼子查詢的最外層會被標記爲primary微信

subquery

在select或者where裏包含了子查詢,那麼子查詢就會被標記爲subQquery,同三.二同時出現性能

derived

在from中包含的子查詢,會被標記爲衍生查詢,會把查詢結果放到一個臨時表中學習

union / union result

若是有兩個select查詢語句,他們之間用union連起來查詢,那麼第二個select會被標記爲union,union的結果被標記爲union result。它的id是爲null的優化

4、table

表示這一行的數據是哪張表的數據

5、type

type是表明MySQL使用了哪一種索引類型,不一樣的索引類型的查詢效率也是不同的,type大體有如下種類

  • system
  • const
  • eq_ref
  • ref
  • range
  • index
  • all

system

表中只有一行記錄,system是const的特例,幾乎不會出現這種狀況,能夠忽略不計

const

將主鍵索引或者惟一索引放到where條件中查詢,MySQL能夠將查詢條件轉變成一個常量,只匹配一行數據,索引一次就找到數據了

eq_ref

在多表查詢中,如T1和T2,T1中的一行記錄,在T2中也只能找到惟一的一行,說白了就是T1和T2關聯查詢的條件都是主鍵索引或者惟一索引,這樣才能保證T1每一行記錄只對應T2的一行記錄

舉個不太恰當的例子,EXPLAIN SELECT * from t1 , t2 where t1.id = t2.id

ref

不是主鍵索引,也不是惟一索引,就是普通的索引,可能會返回多個符合條件的行。

range

體如今對某個索引進行區間範圍檢索,通常出如今where條件中的between、and、<、>、in等範圍查找中。

index

將全部的索引樹都遍歷一遍,查找到符合條件的行。索引文件比數據文件仍是要小不少,因此比不用索引全表掃描仍是要快不少。

all

沒用到索引,單純的將表數據所有都遍歷一遍,查找到符合條件的數據

6、possible_keys

這次查詢中涉及字段上若存在索引,則會被列出來,表示可能會用到的索引,但並非實際上必定會用到的索引

7、key

這次查詢中實際上用到的索引

8、key_len

表示索引中使用的字節數,經過該屬性能夠知道在查詢中使用的索引長度,注意:這個長度是最大可能長度,並不是實際使用長度,在不損失精確性的狀況下,長度越短查詢效率越高

9、ref

顯示關聯的字段。若是使用常數等值查詢,則顯示const,若是是鏈接查詢,則會顯示關聯的字段。

20191027300114\_18.png

#1.tb_emp表爲非惟一性索引掃描,實際使用的索引列爲idx_name,因爲tb_emp.name='rose'爲一個常量,因此ref=const。

#2.tb_dept爲惟一索引掃描,從sql語句能夠看出,實際使用了PRIMARY主鍵索引,ref=db01.tb_emp.deptid表示關聯了db01數據庫中tb_emp表的deptid字段。

10、rows

根據表信息統計以及索引的使用狀況,大體估算說要找到所需記錄須要讀取的行數,rows越小越好

11、extra

不適合在其餘列顯示出來,但在優化時十分重要的信息

(1)using fileSort(重點)

俗稱 " 文件排序 " ,在order by或者在group by排序的過程當中,order by的字段不是索引字段,或者select查詢字段存在不是索引字段,或者select查詢字段都是索引字段,可是order by字段和select索引字段的順序不一致,都會致使fileSort

(2)using temporary(重點)

使用了臨時表保存中間結果,常見於order by和group by中。

(3)USING index(重點)

表示相應的select操做中使用了覆蓋索引(Coveing Index),避免訪問了表的數據行,效率不錯!
若是同時出現using where,代表索引被用來執行索引鍵值的查找;若是沒有同時出現using where,表面索引用來讀取數據而非執行查找動做。

(4) Using where

代表使用了where過濾

(5) using join buffer

使用了鏈接緩存

(6) impossible where

where子句的值老是false,不能用來獲取任何元組

(7) select tables optimized away

在沒有GROUPBY子句的狀況下,基於索引優化MIN/MAX操做或者
對於MyISAM存儲引擎優化COUNT(*)操做,沒必要等到執行階段再進行計算,
查詢執行計劃生成的階段即完成優化。

(8) distinct

優化distinct,在找到第一匹配的元組後即中止找一樣值的工做

下篇文章講講如何優化MySQL性能

關注微信公衆號:IT老哥

回覆Java全套教程,便可領取:Java基礎、Java web、JavaEE所有的教程,包括spring boot等

回覆:簡歷模板,便可獲取100份精美簡歷

回覆:Java學習路線,便可獲取最新最全的一份學習路線圖

回覆:Java電子書,便可領取13本頂級程序員必讀書籍

相關文章
相關標籤/搜索