SQL中EXPLAIN命令詳解

2021-09-10 16:58:02 字數 2521 閱讀 8632

本文**:

explain裡面最關注以下幾列:

type

本次查詢表聯接型別,從這裡可以看到本次查詢大概的效率

key最終選擇的索引,如果沒有索引的話,本次查詢效率通常很差

key_len

本次查詢用於結果過濾的索引實際長度

rows

預計需要掃瞄的記錄數,預計需要掃瞄的記錄數越小越好

extra

額外附加資訊,主要確認是否出現using filesort、using temporary這兩種情況

explain  展示mysql執行計畫使用方法,在select語句前加上explain就可以了,如:

explain select surname,first_name from a,b where a.id=b.id
id:select識別符。這是select的查詢序列號。

select_type:select型別。看個大概,一般沒用。

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

primary: 最外面的select

union:union中的第二個或後面的select語句

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

union result:union的結果

subquery:子查詢中的第乙個select

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

derived:匯出表的select(from子句的子查詢)

table:表名

type:聯接型別。由上至下,效率越來越高

all:全表掃瞄。sql語句處於一種最原生的狀態,有很大的優化空間。

index:索引被掃瞄。該聯接型別與all相同,除了只有索引樹被掃瞄。這通常比all快,因為索引檔案通常比資料檔案小。

range:有範圍的索引掃瞄,相對於index的全索引掃瞄,它有範圍限制,因此要優於index。出現了range,則一定是基於索引的。同時除了顯而易見的between,and以及'>','<'外,in和or也是索引範圍掃瞄。

index_subquery、unique_subquery:暫時沒遇到,以後再補上

index_merge:該聯接型別表示使用了索引合併優化方法。對多個索引分別進行條件掃瞄,然後將它們各自的結果進行合併

ref:查詢條件列使用了索引而且不為主鍵和unique。其實,意思就是雖然使用了索引,但該索引列的值並不唯一,有重複。這樣即使使用索引快速查詢到了第一條資料,仍然不能停止,要進行目標值附近的小範圍掃瞄。

eq_ref:ref相比牛的地方是,它知道這種型別的查詢結果集只有乙個?什麼情況下結果集只有乙個呢!那便是使用了主鍵或者唯一性索引進行查詢的情況

const:表最多有乙個匹配行,它將在查詢開始時被讀取。因為僅有一行,在這行的列值可被優化器剩餘部分認為是常數。const用於用常數值比較primary key或unique索引的所有部分時。

system:表僅有一行(=系統表)。這是const聯接型別的乙個特例。

null:mysql不訪問任何表或索引,直接返回結果

possible_keys:可能用到的索引,多了需要優化。

key:key列顯示mysql實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是null。

key_len:key_len列顯示mysql決定使用的鍵長度。

ref:ref列顯示使用哪個列或常數與key一起從表中選擇行。

rows:掃瞄行數。rows列顯示mysql認為它執行查詢時必須檢查的行數。

extra:詳細資訊。

using index:索引覆蓋。直接通過索引就可以獲取查詢的資料。

using where:需要回行。在查詢使用索引的情況下,需要回表去查詢所需的資料

using sort_union、using union、using intersect:這些函式說明如何為index_merge聯接型別合併索引掃瞄。

通過相乘explain輸出的rows列的所有值,可以粗略地知道mysql必須檢查多少行以執行查詢。

請拿起 explain **,如果你看到以下現象,請優化:

1)出現了using temporary,一般臨時表排序,需要優化

2)出現了using filesort,排序時無法使用到索引時,就會出現這個

3)rows過多,或者幾乎是全表的記錄數

4)key 是 (null)

5)possible_keys 出現過多(待選)索引

MySQL中EXPLAIN命令詳解

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法,在select語句前加上explain就可以了 如 explain select surname first name form a b where a id b id...

MySQL 中 EXPLAIN 命令詳解

explain 顯示了 mysql 如何使用索引來處理 select 語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法,在 select 語句前加上explain就可以了 如 explain select surname first name form a b where a ...

詳解MySQL中EXPLAIN解釋命令

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法,在select語句前加上explain就可以了 如 explain select surname,first name form a,b where a.id b.id...