EXPLAIN列的解釋:
table:顯示這一行的資料是關於哪張表的
type:這是重要的列,顯示連線使用了何種型別。從最好到最差的連線型別為const、eq_reg、ref、range、indexhe和ALL
possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從WHERE語句中選擇一個合適的語句。這個列表是在優化過程的早期建立的,因此有些列出來的索引可能對於後續優化過程是沒有用的。
key: 實際使用的索引。如果為NULL,則沒有使用索引。很少的情況下,MYSQL會選擇優化不足的索引。這種情況下,可以在SELECT語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MYSQL忽略索引
如果該索引沒有出現在possible_keys中,那麼mysql選用的是出於另外的原因——例如,他可能選擇了一個覆蓋索引,哪怕沒有where字句,換句話說,possible_keys揭示了哪一個索引能有助於提高查詢效率,而key顯示的是優化採用哪一個索引可以最小化查詢成本。
key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數
rows:MYSQL認為必須檢查的用來返回請求資料的行數
Extra:關於MYSQL如何解析查詢的額外資訊。將在表4.3中討論,但這裡可以看到的壞的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,結果是檢索會很慢
Type列的解釋
Type:告訴我們對錶使用的訪問方式,主要包含如下集中型別。
all:全表掃描。
const:讀常量,最多隻會有一條記錄匹配,由於是常量,實際上只須要讀一次。
eq_ref:最多隻會有一條匹配結果,一般是通過主鍵或唯一鍵索引來訪問。
fulltext:進行全文索引檢索。
index:全索引掃描。
index_merge:查詢中同時使用兩個(或更多)索引,然後對索引結果進行合併(merge),再讀取表資料。
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 的組成而使用的優化方法,可以部分減少資料訪問次數。
写评论
很抱歉,必須登入網站才能發佈留言。