MySQL的explain分析sql語句


explain分析查詢

使用 EXPLAIN 關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸。通過explain命令可以得到:

  •  表的讀取順序
  •  數據讀取操作的操作類型
  •  哪些索引可以使用
  •  哪些索引被實際使用
  •  表之間的引用
  •  每張表有多少行被優化器查詢

如下為實驗表格:里面有1萬條測試數據

 

 

EXPLAIN字段解析:

1、table:顯示這一行的數據是關於哪張表的

2、type:這是最重要的字段之一,顯示查詢使用了何種類型。

    從最好到最差的連接類型為system、const、eq_reg、ref、range、index和ALL,一般來說,得保證查詢至少達到range級別,最好能達到ref。

type中包含的值: system、const: 可以將查詢的變量轉為常量. 如id=1; id為 主鍵或唯一鍵. eq_ref: 訪問索引,返回某單一行的數據.(通常在聯接時出現,查詢使用的索引為主鍵或惟一鍵) ref: 訪問索引,返回某個值的數據.(可以返回多行) 通常使用=時發生 range: 這個連接類型使用索引返回一個范圍中的行,比如使用>或<查找東西,並且該字段上建有索引時發生的情況(注:不一定好於index) index: 以索引的順序進行全表掃描,優點是不用排序,缺點是還要全表掃描 ALL: 全表掃描,應該盡量避免

3、possible_keys:顯示可能應用在這張表中的索引。如果為空,表示沒有可能應用的索引。

4、key:實際使用的索引。如果為NULL,則沒有使用索引。

    MySQL很少會選擇優化不足的索引,此時可以在SELECT語句中使用FORCE INDEX(index_name)來強制使用一個索引或者用IGNORE INDEX(index_name)來強制忽略索引。

    MySQL強制使用和不使用索引:https://www.cnblogs.com/lcngu/p/6023179.html

5、key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好

6、ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數

7、rows:MySQL認為必須檢索的用來返回請求數據的行數

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM