explain 用法詳解

2022-03-28 07:24:41 字數 1872 閱讀 2527

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。

使用方法,在select語句前加上explain就可以了:

如:explainselectsurname,first_name form a,bwherea.id=b.id 

explain列的解釋:

table:顯示這一行的資料是關於哪張表的

type:這是重要的列,顯示連線使用了何種型別。從最好到最差的連線型別為const、eq_reg、ref、range、indexhe和all

key: 實際使用的索引。如果為null,則沒有使用索引。很少的情況下,mysql會選擇優化不足的索引。這種情況下,可以在select語句中使用use index(indexname)來強制使用乙個索引或者用ignore index(indexname)來強制mysql忽略索引

key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好

ref:顯示索引的哪一列被使用了,如果可能的話,是乙個常數

rows:mysql認為必須檢查的用來返回請求資料的行數

extra:關於mysql如何解析查詢的額外資訊。將在表4.3中討論,但這裡可以看到的壞的例子是using temporary和using filesort,意思mysql根本不能使用索引,結果是檢索會很慢

extra列返回的描述的意義

distinct:一旦mysql找到了與行相聯合匹配的行,就不再搜尋了

not exists: mysql優化了left join,一旦它找到了匹配left join標準的行,就不再搜尋了

range checked for each record(index map:#):沒有找到理想的索引,因此對於從前面表中來的每乙個行組合,mysql檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連線之一

using filesort: 看到這個的時候,查詢就需要優化了。mysql需要進行額外的步驟來發現如何對返回的行排序。它根據連線型別以及儲存排序鍵值和匹配條件的全部行的行指標來排序全部行

using index: 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同乙個索引的部分的時候

using temporary 看到這個的時候,查詢需要優化了。這裡,mysql需要建立乙個臨時表來儲存結果,這通常發生在對不同的列集進行order by上,而不是group by上

where used 使用了where從句來限制哪些行將與下一張表匹配或者是返回給使用者。如果不想返回表中的全部行,並且連線型別all或index,這就會發生,或者是查詢有問題不同連線型別的解釋(按照效率高低的順序排序)

system 表只有一行:system表。這是const連線型別的特殊情況

const:表中的乙個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為mysql先讀這個值然後把它當做常數來對待

eq_ref:在連線中,mysql在查詢時,從前面的表中,對每乙個記錄的聯合都從表中讀取乙個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用

ref:這個連線型別只有在查詢使用了不是惟一或主鍵的鍵或者是這些型別的部分(比如,利用最左邊字首)時發生。對於之前的表的每乙個行聯合,全部記錄都將從表中讀出。這個型別嚴重依賴於根據索引匹配的記錄多少—越少越好

range:這個連線型別使用索引返回乙個範圍中的行,比如使用》或《查詢東西時發生的情況

index: 這個連線型別對前面的表中的每乙個記錄聯合進行完全掃瞄(比all更好,因為索引一般小於表資料)

all:這個連線型別對於前面的每乙個記錄聯合進行完全掃瞄,這一般比較糟糕,應該盡量避免

explain 用法詳解

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

explain 命令引數詳解

id mysql query optimizer選定的執行計畫中查詢的序列號。select type 所使用的查詢型別,主要有以下這幾種查詢型別。dependent subquery 子查詢內層的第乙個select,依賴於外部查詢的結果集。dependent union 子查詢中的union,且為u...

EXPLAIN各個引數詳解

常見的取值有 簡單表,即不使用表連線或者子查詢 primary 主查詢,即外層的查詢 union union 中的第二個或者後面的查詢語句 subquery 子查詢中的第乙個 select 等。1.system 表中僅有一行,即常量表 2.const 單錶中最多有乙個匹配行,例如 primary k...