MySql Explain解釋說明

2021-08-14 18:34:10 字數 4698 閱讀 1762

explain解釋說明:

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

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

如:

explain select surname,first_name form a,b where a.id=b.id
分析結果形式如下: 

table |  type | possible_keys | key | key_len  | ref | rows | extra 

explain列的解釋: 

1 table:

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

2 type:

這是重要的列,顯示連線使用了何種型別。

從最好到最差的連線型別為:system、const、eg_reg、ref、ref_or_null、 range、indexhe、 all。

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

const:(primary key或unique)

表最多有乙個匹配行,它將在查詢開始時被讀取。因為僅有一行,在這行的列值可被優化器剩餘部分認為是常數。

const表很快,因為它們只讀取一次!

const用於用常數值比較primary key或unique索引的所有部分時。

在下面的查詢中,tbl_name可以用於const表:

select * from tbl_name where primary_key=1;
eq_reg:key

對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。

它用在乙個索引的所有部分被聯接使用並且索引是unique或primary key。

eq_ref可以用於使用= 操作符比較的帶索引的列。比較值可以為常量或乙個使用在該錶前面所讀取的表的列的表示式。

在下面的例子中,mysql可以使用eq_ref聯接來處理ref_tables:

select * from ref_table,other_table where ref_table.key_column=other_table.column;  

select * from ref_table,other_table where ref_table.key_column_part1=other_table.column

and ref_table.key_column_part2=1;

ref:key

對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,

或如果鍵不是unique或primary key(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。

如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的。

ref可以用於使用=或<=>操作符的帶索引的列。

在下面的例子中,mysql可以使用ref聯接來處理ref_tables:

select * from ref_table where key_column=expr;  

select * from ref_table,other_table where ref_table.key_column=other_table.column;

select * from ref_table,other_table where ref_table.key_column_part1=other_table.column

and ref_table.key_column_part2=1;

ref_or_null:or is null

該聯接型別如同ref,但是新增了mysql可以專門搜尋包含null值的行。在解決子查詢中經常使用該聯接型別的優化。

在下面的例子中,mysql可以使用ref_or_null聯接來處理ref_tables:

select * from ref_table where key_column=expr or key_column is null;      

range:=、<>、>、>=、<、<=、is null、<=>、between或者in

只檢索給定範圍的行,使用乙個索引來選擇行。key列顯示使用了哪個索引。

key_len包含所使用索引的最長關鍵元素。在該型別中ref列為null。

當使用=、<>、>、>=、<、<=、is null、<=>、between或者in操作符,用常量比較關鍵字列時,可以使用range:

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);

select * from tbl_name where key_part1= 10 and key_part2 in (10,20,30);

indexhe:

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

當查詢只使用作為單索引一部分的列時,mysql可以使用該聯接型別。

all:

對於每個來自於先前的表的行組合,進行完整的表掃瞄。如果表是第乙個沒標記const的表,

這通常不好,並且通常在它情況下很差。通常可以增加更多的索引而不要使用all,

使得行能基於前面的表中的常數值或列值被檢索出。

3 possible_keys :

顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從where語句中  

選擇乙個合適的語句

4 key :

實際使用的索引。如果為null,則沒有使用索引。很少的情況下,mysql會選擇優化不足的索引  。

這種情況下,可以在select語句中使用useindex(indexname)來強制使用乙個索引或者用ignore index(indexname)來強制mysql忽略索引 

5.key_len:

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

【詳細】

6 ref 

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

7 rows 

mysql認為必須檢查的用來返回請求資料的行數 (掃瞄行的數量)

8 extra 

該列包含mysql解決查詢的詳細資訊

關於mysql如何解析查詢的額外資訊。將在表4.3中討論,但這裡可以看到的壞的例子是using temporary和using filesort,

意思mysql根本不能使用索引,結果是檢索會很慢 

extra列返回的描述的意義 

distinct:

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

not exists :

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

面是乙個可以這樣優化的查詢型別的例子:

select * from t1 left join t2 on t1.id=t2.id where t2.id is null;
假定t2.id定義為not null。在這種情況下,mysql使用t1.id的值掃瞄t1並查詢t2中的行。

如果mysql在t2中發現乙個匹配的行,它知道t2.id絕不會為null,並且不再掃瞄t2內有相同的id值的行。

換句話說,對於t1的每個行,mysql只需要在t2中查詢一次,無論t2內實際有多少匹配的行。

range checked for each record(index map:#) 

沒有找到理想的索引,因此對於從前面表中來的每乙個行組合,mysql檢查使用哪個索引,並用它來從表中返回行。

這是使用索引的最慢的連線之一 

mysql沒有發現好的可以使用的索引,但發現如果來自前面的表的列值已知,可能部分索引可以使用。

對前面的表的每個行組合,mysql檢查是否可以使用range或index_merge訪問方法來索取行。

關於適用性標準的描述參見7.2.5節,「範圍優化」和7.2.6節,「索引合併優化」,

不同的是前面表的所有列值已知並且認為是常量。這並不很快,但比執行沒有索引的聯接要快得多。

using filesort 

看到這個的時候,查詢就需要優化了。mysql需要進行額外的步驟來發現如何對返回的行排序。

它根據連線型別以及儲存排序鍵值和匹配條件的全部行的行指標來排序全部行 

using index 

列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,

這發生在對錶的全部的請求列都是同乙個索引的部分的時候 

using temporary 

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

using where

使用了where從句來限制哪些行將與下一張表匹配或者是返回給使用者。如果不想返回表中的全部行,

並且連線型別all或index,這就會發生,或者是查詢有問題 

impossible where noticed after reading const table...

MySQL explain欄位解釋

1.select type 它表示簡單的select,沒有union和子查詢 dependent union union依賴外層的查詢 dependent subquery subquery依賴外層的查詢 2.type system 表僅有一行,這是const型別的特列,平時不會出現,一般出現在my...

MySQL explain 最全解釋

explain命令用來檢視sql語句的執行計畫,檢視該sql語句有沒有使用上了索引,有沒有做全表掃瞄 表的讀取順序。對應id 資料讀取操作的操作型別。對應select type 哪些索引可以使用。對應possible keys 哪些索引被實際使用。對應key 表直接的引用。對應ref 每張表有多少行...

Mysql Explain 引數解釋

查詢計畫使用以及使用說明 table 顯示這一行資料是關於哪張表的。type 顯示使用了何種型別,從最好到最差的連線型別為system const eq ref ref fulltext ref or null index merge unique subquery index subquery r...