使用 EXPLAIN 關鍵字 檢查SQL語句效率

2021-08-05 19:57:14 字數 2184 閱讀 5397

explain詳細說明

通過explain可以知道mysql是如何處理語句,分析出查詢或是表結構的效能瓶頸。通過expalin可以得到:

1. 表的讀取順序

2.表的讀取操作的操作型別

3.哪些索引可以使用

4. 哪些索引被實際使用

5.表之間的引用

6.每張表有多少行被優化器查詢

通過explain 【sql語句】能夠檢視sql語句的各項效能,下面了解下各列名代表的含義:

id:mysql queryoptimizer 選定的執行計畫中查詢的序列號。表示查詢中執行 select 子句或操作表的順序,

id 值越大優先順序越高,越先被執行。id 相同,執行順序由上至下。

select_type一共有9中型別,只介紹常用的4種:

******: 簡單的 select 查詢,不使用 union 及子查詢

primary: 最外層的 select 查詢

union: union 中的第二個或隨後的 select 查詢,不依賴於外部查詢的結果集

derived: 用於 from 子句裡有子查詢的情況。 mysql會遞迴執行這些子查詢, 把結果放在臨時表裡。

table:輸出行所引用的表

type:從有到差的順序如下:

system-->const-->eq_ref-->ref-->ref_or_null-->index_merge-->unique_subquery-->index_subquery-->range-->index-->all.

各自的含義如下:

system: 表僅有一行(=系統表)。這是 const 連線型別的乙個特例。

const: const 用於用常數值比較 primary key 時。當 查詢的表僅有一行時,使用 system。

eq_ref: 從前面的表中,對每乙個記錄的聯合都從表中讀取乙個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用

ref: 連線不能基於關鍵字選擇單個行,可能查詢 到多個符合條件的行。 叫做 ref 是因為索引要 跟某個參考值相比較。

這個參考值或者是一 個常數,或者是來自乙個表裡的多表查詢的 結果值。

ref_or_null: 如同 ref, 但是 mysql 必須在初次查詢的結果 裡找出 null 條目,然後進行二次查詢。

index_merge: 說明索引合併優化被使用了。

unique_subquery: 在某些 in 查詢中使用此種型別,而不是常規的 ref:valuein (select primary_key from single_table where some_expr)

index_subquery: 在 某 些 in 查 詢 中 使 用 此 種 類 型 , 與 unique_subquery 類似,但是查詢的是非唯一 性索引

range: 只檢索給定範圍的行,使用乙個索引來選擇 行。key 列顯示使用了哪個索引。

當使用=、 <>、>、>=、<、<=、is null、<=>、between 或者 in 操作符,用常量比較關鍵字列時,可 以使用 range。

index: 全表掃瞄,只是掃瞄表的時候按照索引次序 進行而不是行。主要優點就是避免了排序, 但是開銷仍然非常大。

all: 最壞的情況,從頭到尾全表掃瞄。

possible_keys : 指出能在該表中使用哪些索引有助於 查詢。如果為空,說明沒有可用的索引。

key:實際從 possible_key 選擇使用的索引。 如果為 null,則沒有使用索引。很少的情況 下,mysql 會選擇優化不足的索引。這種情 況下,可以在 select 語句中使用 use index (indexname)來強制使用乙個索引或者用ignore index(indexname)來強制 mysql 忽略索引

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

ref: 顯示索引的哪一列被使用了

rows: 認為必須檢查的用來返回請求資料的行數

extra中出現以下 2 項意味著 根本不能使用索引,效率會受到重大影響。應盡可能對此進行優化。

從上述對列名進行介紹,你對效能檢測結果有乙個大概的了解了吧.其中type為all的地方,都是需要進行優化的地方.

在對sql語句的效能檢測最少也應該到達range,這樣才可以忍受.

目前我的技術水平和專案要求,主要考慮type這列的優化。既然檢測出來的結果有all ,那麼就需要優化,具體怎麼優化,請看我下期部落格。

Explain關鍵字詳解

使用explain關鍵字可以模擬優化器執行sql語句,分析你的查詢語句或是結構的效能瓶頸 在 select 語句之前增加 explain 關鍵字,mysql 會在查詢上設定乙個標記,執行查詢會返回執行計畫的資訊,而不是執行這條sql 像這樣 create table actor id int pri...

mysql之explain關鍵字

1 用mysql儲存過程增加100萬條測試資料 儲存過程 建立儲存過程,資料庫名test,表名student create procedure myinst n int begin declare i int default0 set autocommit 0 repeat set i i 1 in...

MySQL 中 explain關鍵字

select 查詢的序列號,包含一組數字,表示查詢中執行 select 子句或操作表的順序。三種情況 id 相同 執行順序由上而下 from t1,t2,t3 where t1.id t2.id and t1.id t3.id and t1.other column from t2 where id...