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...