MySQL的explain分析sql語句

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了。

相關文章
相關標籤/搜索