本文**:
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...