天天看點

EXPLAIN分析SQL的執行計劃

通過EXPLAIN分析低效SQL的執行計劃

可以通過EXPLAIN或者DESC指令擷取MySQL如何實行SELECT語句的資訊,包括在SELECT語句執行過程中表如何連接配接和連接配接的順序。

explain select *from myuser where loginname='2017'

id:1

select_type:SIMPLE

table:myuser

type :const

possible_keys:PRIMARY

key:PRIMARY

key_len:4

ref:const

row :1

extra

對于每個列簡單地進行一下說明

id

select查詢的序列号

select_type

select查詢的類型,主要是差別普通查詢和聯合查詢、子查詢之類的複雜查詢。

table

輸出的行所引用的表。

type

聯合查詢所使用的類型。

type顯示的是通路類型,是較為重要的一個名額,結果值從好到壞依次是:

system > const > eq_ref > ref > fulltext> ref_or_null > index_merge > unique_subquery > index_subquery >range > index > ALL

一般來說,得保證查詢至少達到range級别,最好能達到ref。

type=ALL,全表掃描,MySQL周遊全表來找到比對的行

type=index,索引全掃描,MySQL周遊整個索引來查詢比對的行

type=range,索引範圍掃描,常見于<,<=,>,>=.between等操作

select * frompayment where customer_id >=300 and customer_id <=350

type=ref,使用非唯一索引掃描或唯一索引的字首掃描,傳回比對某個單獨值的記錄行

select * frompayment where customer_id =350

type=eq_ref,類似ref,差別就在使用的索引是唯一索引,對于每個索引鍵值,表中隻有一條記錄比對

type=const/system,單表中最多有一個比對行,查詢起來非常迅速,查詢起來非常迅速,是以這個比對行中的其他列的值可以被優化器在目前查詢中當做常量來處理,例如,根據主鍵primary key或者唯一索引unique_index進行的查詢。

type=NULL,MySQL不用通路表或者索引,直接就能夠得到結果

select 1 from duanwhere 1

possible_keys

指出MySQL能使用哪個索引在該表中找到行。如果是空的,沒有相關的索引。這時要提高性能,可通過檢驗WHERE子句,看是否引用某些字段,或者檢查字段不是适合索引。

key

顯示MySQL實際決定使用的鍵。如果沒有索引被選擇,鍵是NULL。

key_len

顯示MySQL決定使用的鍵長度。如果鍵是NULL,長度就是NULL。文檔提示特别注意這個值可以得出一個多重主鍵裡mysql實際使用了哪一部分。

ref

顯示哪個字段或常數與key一起被使用。

rows

這個數表示mysql要周遊多少資料才能找到,在innodb上是不準确的。

Extra

如果是Only index,這意味着資訊隻用索引樹中的資訊檢索出的,這比掃描整個表要快。

如果是where used,就是使用上了where限制。

如果是impossible where 表示用不着where,一般就是沒查出來啥。

如果此資訊顯示Using filesort或者Using temporary的話會很吃力,WHERE和ORDER BY的索引經常無法兼顧,如果按照WHERE來确定索引,那麼在ORDER BY時,就必然會引起Using filesort,這就要看是先過濾再排序劃算,還是先排序再過濾劃算。