explain分析查詢html
使用 EXPLAIN 關鍵字能夠模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。這能夠幫你分析你的查詢語句或是表結構的性能瓶頸。經過explain命令能夠獲得:mysql
- 表的讀取順序
- 數據讀取操做的操做類型
- 哪些索引能夠使用
- 哪些索引被實際使用
- 表之間的引用
- 每張表有多少行被優化器查詢
以下爲實驗表格:裏面有1萬條測試數據sql
EXPLAIN字段解析:post
一、table:顯示這一行的數據是關於哪張表的性能
二、type:這是最重要的字段之一,顯示查詢使用了何種類型。測試
從最好到最差的鏈接類型爲system、const、eq_reg、ref、range、index和ALL,通常來講,得保證查詢至少達到range級別,最好能達到ref。優化
type中包含的值: system、const: 能夠將查詢的變量轉爲常量. 如id=1; id爲 主鍵或惟一鍵. eq_ref: 訪問索引,返回某單一行的數據.(一般在聯接時出現,查詢使用的索引爲主鍵或唯一鍵) ref: 訪問索引,返回某個值的數據.(能夠返回多行) 一般使用=時發生 range: 這個鏈接類型使用索引返回一個範圍中的行,好比使用>或<查找東西,而且該字段上建有索引時發生的狀況(注:不必定好於index) index: 以索引的順序進行全表掃描,優勢是不用排序,缺點是還要全表掃描 ALL: 全表掃描,應該儘可能避免
三、possible_keys:顯示可能應用在這張表中的索引。若是爲空,表示沒有可能應用的索引。spa
四、key:實際使用的索引。若是爲NULL,則沒有使用索引。3d
MySQL不多會選擇優化不足的索引,此時能夠在SELECT語句中使用FORCE INDEX(index_name)來強制使用一個索引或者用IGNORE INDEX(index_name)來強制忽略索引。指針
MySQL強制使用和不使用索引:http://www.javashuo.com/article/p-dzkxenrm-de.html
五、key_len:使用的索引的長度。在不損失精確性的狀況下,長度越短越好
六、ref:顯示索引的哪一列被使用了,若是可能的話,是一個常數
七、rows:MySQL認爲必須檢索的用來返回請求數據的行數
八、Extra:關於MySQL如何解析查詢的額外信息,主要有如下幾種
Extra中包含的值:
using index: 只用到索引,能夠避免訪問表,性能很高。 using where: 使用到where來過濾數據, 不是全部的where clause都要顯示using where. 如以=方式訪問索引。 using tmporary: 用到臨時表去處理當前的查詢。 using filesort: 用到額外的排序,此時mysql會根據聯接類型瀏覽全部符合條件的記錄,並保存排序關鍵字和行指針,而後排序關鍵字並按順序檢索行。(當使用order by v1,而沒用到索引時,就會使用額外的排序)。 range checked for eache record(index map:N): 沒有好的索引能夠使用。
Using index for group-by:代表能夠在索引中找到分組所需的全部數據,不須要查詢實際的表。explain select user_id from t_order group by user_id;
見到Using temporary和Using filesort,就意味着MySQL根本不能使用索引,結果是檢索會很慢,須要優化sql了。