explain對我們優化sql語句是非常有幫助的。可以通過explain+sql語句的方式分析當前sql語句。
顯示這一行資料屬於哪張表,若在查詢中為select起了別名,則顯示別名。
temp
where id=
11789
type
在表裡查到結果所用的方式。包括(效能有差——>高): all | index | range | ref | eq_ref | const,system | null |
all:全表掃瞄,mysql 從頭到尾掃瞄整張表查詢行。
temp limit 100
注意:這裡雖然使用limit但並不能改變全表掃瞄。
index:按索引掃瞄表,雖然還是全表掃瞄,但優點是索引是有序的。
temp limit 100
range:以範圍的方式掃瞄索引。比較運算子,以及in的type都是range。
explain selectref:非唯一性索引訪問*temp
where id>
100 limit 199
explain selecteq_ref:使用唯一性索引查詢(主鍵或唯一索引)*temp
where dt=
'2015-01-02
' limit 199
const:常量,在整個查詢過程中這個表最多隻會有一條匹配的行,比如主鍵 id=1 就肯定只有一行,只需讀取一次表資料便能取得所需的結果,且表資料在分解執行計畫時讀取。
explain select
*11790
注意:system 是 const 型別的特例,當表只有一行時就會出現 system 。
null:在優化的過程已經得到結果,不再需要訪問表或索引。例如表中並不存在id=1000的記錄。
explain selectpossible_keys可能被用到的索引。*1000
explain selectkey查詢過程中實際用到的索引,例子如上圖,實際用的索引列為主鍵列。*100 limit 100 ;
key_len
索引字段最大可能使用的長度。例如上圖中,key_len:4,因為主鍵是int型別,長度為4.
ref
指出對key列所選擇的索引的查詢方式,常見的有const,func,null,具體欄位名。當key列為null,即不使用索引時,此值也為null.
rows
mysql估計需要掃瞄的行數,只是乙個估算。
extra
這個顯示其他的一些資訊,但對優化sql也非常的重要。
using index:此查詢使用了覆蓋索引(convering index),即通過索引就能返回結果,無需訪問表。弱沒顯示「using index」表示讀取了表資料。
因為 id 為主鍵索引,索引中直接包含了 id 的值,所以無需訪問表,直接查詢索引就能返回結果。
using where:mysql從儲存引擎收到行後再進行「後過濾(post-filter)」。後過濾:先讀取整行資料,再檢查慈航是否符合where的條件,符合就留下,不符合便丟棄。檢測是在讀取行後進行的,所以叫後過濾。
100 limit 100;
using temporary:使用到臨時表,在使用臨時表的時候,extra為這個值。
using filesort:若查詢所需的排序與使用的索引的排序一直,因為索引已排序,因此按索引的順序讀取結果返回,否則,在取到結果後,還需要按查詢所需的順序對結果進行排序,這時就會出現using filesort。
通過上面你可以看到type乙個為all,乙個為range。為all的查詢需要23+s,而下面的則只需要0.3s。通過rows也能看出優化後,表掃瞄的行數變化。
參考資料
《高效能 mysql》(第三版)
部落格版權:
mysql explain 用法分析
explain select id 選擇識別符號 select type 表示查詢的型別。table 輸出結果集的表 partitions 匹配的分割槽 type 表示表的連線型別 possible keys 表示查詢時,可能使用的索引 key 表示實際使用的索引 key len 索引欄位的長度 r...
Mysql Explain用法詳解
4.explain select type 資料讀取操作的操作型別 5.table 6.type 7.possible keys和key 8.key len 9.ref 10.rows 11.extra 使用方式 explain sql語句 這裡的id不是主鍵,它是一組數字12345這種,表示我們進...
mysql explain用法和結果的含義
詳細可參考 explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法,在select語句前加上explain就可以了 如 explain select surname,first name form a,b where a.i...