MySQL的explain欄位解釋

2021-10-21 20:28:16 字數 4646 閱讀 1386

explain命令是檢視查詢優化器是如何決定執行查詢的主要方法。這個功能有侷限性,並不總會說出真相,但它的輸出是可以獲取的最好資訊,值得花時間去了解,因為可以學習到查詢是如何執行的。學會解釋explain將會幫助你了解mysql優化器是如何工作的。

先上官方文件**:

列欄位含義

id查詢序號

select_type

查詢型別

table

表名type

join型別

partitions

匹配的分割槽

possible_keys

可能選擇的索引

key實際選擇的索引

key_len

索引長度

ref與索引作比較的列

rows

大概需要檢索的行數

filtered

按表條件過濾的行百分比

extra

附加資訊

1.id

這一列總是包含乙個編號,標識select所屬的行。如果在語句當中沒有子查詢活聯合查詢,那麼就只會有唯一的select,於是每一行在這個列中都將顯示乙個1。否則,內層的select語句一般會順序編號,對應於其在原始語句的位置。

2.select_type

查詢的型別,可以是下表的任何一種型別:

select_type

字段說明

select_type

型別說明

******

簡單select(不使用union或子查詢)

primary

最外層的select

union

union中第二個或之後的select語句

dependent union

union中第二個或之後的select語句取決於外面的查詢

union result

union的結果

subquery

子查詢中的第乙個select

dependent subquery

子查詢中的第乙個select, 取決於外面的查詢

derived

衍生表(from子句中的子查詢)

materialized

物化子查詢

uncacheable subquery

結果集無法快取的子查詢,必須重新評估外部查詢的每一行

uncacheable union

union中第二個或之後的select,屬於無法快取的子查詢

3.table

顯示這一步所訪問的資料庫中的表的名稱。

4.type(重要)

這是最重要的字段之一,顯示查詢使用了何種型別。從最好到最差的連線型別依次為:

system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,all

除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到乙個索引。

1、system

表中只有一行資料或者是空表,這是const型別的乙個特例。且只能用於myisam和memory表。如果是innodb引擎表,type列在這個情況通常都是all或者index

2、const

最多只有一行記錄匹配。當聯合主鍵或唯一索引的所有欄位跟常量值比較時,join型別為const。其他資料庫也叫做唯一索引掃瞄

3、eq_ref

多表join時,對於來自前面表的每一行,在當前表中只能找到一行。這可能是除了system和const之外最好的型別。當主鍵或唯一非null索引的所有欄位都被用作join聯接時會使用此型別。

eq_ref可用於使用』='操作符作比較的索引列。比較的值可以是常量,也可以是使用在此表之前讀取的表的列的表示式。

相對於下面的ref區別就是它使用的唯一索引,即主鍵或唯一索引,而ref使用的是非唯一索引或者普通索引。

eq_ref只能找到一行,而ref能找到多行。

4、ref

對於來自前面表的每一行,在此表的索引中可以匹配到多行。若聯接只用到索引的最左字首或索引不是主鍵或唯一索引時,使用ref型別(也就是說,此聯接能夠匹配多行記錄)。

ref可用於使用』=『或』<=>'操作符作比較的索引列。

5、 fulltext

使用全文索引的時候是這個型別。要注意,全文索引的優先順序很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引

6、ref_or_null

跟ref型別類似,只是增加了null值的比較。實際用的不多。

select * from ref_table

where key_column=expr or key_column is null;

7、index_merge

表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and

,or的條件使用了不同的索引,官方排序這個在ref_or_null之後,但是實際上由於要讀取多個索引,效能可能大部分時間都不如range

8、unique_subquery

用於where中的in形式子查詢,子查詢返回不重複值唯一值,可以完全替換子查詢,效率更高。 該型別替換了下面形式的in子查詢的ref:

value in (select primary_key from single_table where some_expr)

9、index_subquery

該聯接型別類似於unique_subquery。適用於非唯一索引,可以返回重複值。

10、range

索引範圍查詢,常見於使用 =, <>, >, >=, <, <=, is null, <=>, between,

in()或者like等運算子的查詢中。

select * from tbl_name where key_column = 10;

select * from tbl_name where key_column between 10 and 20;

select * from tbl_name where key_column in (10,20,30);

11、index

索引全表掃瞄,把索引從頭到尾掃一遍。這裡包含兩種情況:

一種是查詢使用了覆蓋索引,那麼它只需要掃瞄索引就可以獲得資料,這個效率要比全表掃瞄要快,因為索引通常比資料表小,而且還能避免二次查詢。

在extra中顯示using index,反之,如果在索引上進行全表掃瞄,沒有using index的提示。

12、all

全表掃瞄,效能最差。

5.possible_keys

該列顯示的為分割槽表命中的分割槽情況。非分割槽表該字段為空(null)。

6.possible_keys

查詢可能使用到的索引都會在這裡列出來。

7. key

查詢真正使用到的索引。

select_type為index_merge時,這裡可能出現兩個以上的索引,其他的select_type這裡只會出現乙個。

8.key_len

查詢用到的索引長度(位元組數)。

如果是單列索引,那就整個索引長度算進去,如果是多列索引,那麼查詢不一定都能使用到所有的列,用多少算多少。留意下這個列的值,算一下你的多列索引總長度就知道有沒有使用到所有的列了。

key_len只計算where條件用到的索引長度,而排序和分組就算用到了索引,也不會計算到key_len中。

9. ref

如果是使用的常數等值查詢,這裡會顯示const,如果是連線查詢,被驅動表的執行計畫這裡會顯示驅動表的關聯字段,如果是條件使用了表示式或者函式,或者條件列發生了內部隱式轉換,這裡可能顯示為func。

10. rows(重要)

rows 也是乙個重要的字段。 這是mysql估算的需要掃瞄的行數(不是精確值)。

這個值非常直觀顯示 sql 的效率好壞, 原則上 rows 越少越好。

11. filtered

這個字段表示儲存引擎返回的資料在server層過濾後,剩下多少滿足查詢的記錄數量的比例,注意是百分比,不是具體記錄數。這個欄位不重要。

12. extra(重要)

explain 中的很多額外的資訊會在 extra 字段顯示, 常見的有以下幾種內容:

using index : 出現這個說明mysql使用了覆蓋索引,避免訪問了表的資料行,效率不錯。

using where :這說明伺服器在儲存引擎收到行後講進行過濾。

using temporary :這意味著mysql對查詢結果進行排序的時候使用了一張臨時表

using filesort :這個說明mysql會對資料使用乙個外部的索引排序

注意當出現using temporary 和 using filesort時候說明需要優化操作。

關於mysql裡面explain的字段學習

create table test index efficient id int primary keynot null auto increment name varchar 20 varchar 10 country varchar 20 age int 20 engine innodb cha...

Mysql中explain各字段的解釋

explain的用法 explain select 返回結果 下面對上面截圖中的字段一一解釋 1 id select 查詢序列號。id相同,執行順序由上至下 id不同,id值越大優先順序越高,越先被執行。2 select type 查詢資料的操作型別,其值如下 3 table 顯示該行資料是關於哪張...

MySQL 對Explain結果中各字段的解釋

explain作為常用的sql語句優化工具,可根據其結果對sql語句進行分析優化。explain的作用 方便我們對sql語句的優化 explain的使用方式 explain sql語句 explain的結果 id select type table type possible keys key ke...