詳解MySQL中EXPLAIN解釋命令

2022-07-13 08:15:09 字數 2771 閱讀 6846

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

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

explain select * form account
類似下面輸出

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根本不能使用索引,結果是檢索會很慢

type列的解釋

type:告訴我們對錶使用的訪問方式,主要包含如下集中型別。

all:全表掃瞄。

const:讀常量,最多隻會有一條記錄匹配,由於是常量,實際上只須要讀一次。

eq_ref:最多隻會有一條匹配結果,一般是通過主鍵或唯一鍵索引來訪問。

fulltext:進行全文索引檢索。

index:全索引掃瞄。

index_subquery:子查詢中的返回結果字段組合是乙個索引(或索引組合),但不是乙個主鍵或唯一索引。

rang:索引範圍掃瞄。

ref:join語句中被驅動表索引引用的查詢。

ref_or_null:與ref的唯一區別就是在使用索引引用的查詢之外再增加乙個空值的查詢。

system:系統表,表中只有一行資料;

unique_subquery:子查詢中的返回結果字段組合是主鍵或唯一約束。

extra欄位解釋

extra:查詢中每一步實現的額外細節資訊,主要會是以下內容。

distinct:查詢distinct 值,當mysql找到了第一條匹配的結果時,將停止該值的查詢,轉為後面其他值查詢。

full scan on null key:子查詢中的一種優化方式,主要在遇到無法通過索引訪問null值的使用。

range checked for each record (index map: n):通過 mysql 官方手冊的描述,當 mysql query optimizer 沒有發現好的可以使用的索引時,如果發現前面表的列值已知,部分索引可以使用。對前面表的每個行組合,mysql檢查是否可以使用range或 index_merge訪問方法來索取行。

select tables optimized away:當我們使用某些聚合函式來訪問存在索引的某個欄位時,mysql query optimizer 會通過索引直接一次定位到所需的資料行完成整個查詢。當然,前提是在 query 中不能有 group by 操作。如使用min()或max()的時候。

using filesort:當query 中包含 order by 操作,而且無法利用索引完成排序操作的時候,mysql query optimizer 不得不選擇相應的排序演算法來實現。

using index:所需資料只需在 index 即可全部獲得,不須要再到表中取資料。

using index for group-by:資料訪問和 using index 一樣,所需資料只須要讀取索引,當query 中使用group by或distinct 子句時,如果分組欄位也在索引中,extra中的資訊就會是 using index for group-by。

using temporary:當 mysql 在某些操作中必須使用臨時表時,在 extra 資訊中就會出現using temporary 。主要常見於 group by 和 order by 等操作中。

using where:如果不讀取表的所有資料,或不是僅僅通過索引就可以獲取所有需要的資料,則會出現 using where 資訊。

using where with pushed condition:這是乙個僅僅在 ndbcluster儲存引擎中才會出現的資訊,而且還須要通過開啟 condition pushdown 優化功能才可能被使用。控制引數為 engine_condition_pushdown 。

impossible where noticed after reading const tables:mysql query optimizer 通過收集到的統計資訊判斷出不可能存在結果。

no tables:query 語句中使用 from dual或不包含任何 from子句。

not exists:在某些左連線中,mysql query optimizer通過改變原有 query 的組成而使用的優化方法,可以部分減少資料訪問次數。

詳解MySQL中EXPLAIN解釋

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法,在select語句前加上explain就可以了 explain列的解釋 table 顯示這一行的資料是關於哪張表的 type 這是重要的列,顯示連線使用了何種型別。從最...

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 ...