使用 EXPLAIN 關(guān)鍵字 檢查SQL語句效率
explain詳細(xì)說明
通過explain可以知道MySQL是如何處理語句,分析出查詢或是表結(jié)構(gòu)的性能瓶頸。通過expalin可以得到:
1. 表的讀取順序
2.表的讀取操作的操作類型
3.哪些索引可以使用
4. 哪些索引被實(shí)際使用
5.表之間的引用
6.每張表有多少行被優(yōu)化器查詢
通過explain 【sql語句】能夠查看sql語句的各項(xiàng)性能,下面了解下各列名代表的含義:
Id:MySQL QueryOptimizer 選定的執(zhí)行計(jì)劃中查詢的序列號(hào)。表示查詢中執(zhí)行 select 子句或操作表的順序,
id 值越大優(yōu)先級(jí)越高,越先被執(zhí)行。id 相同,執(zhí)行順序由上至下。
Select_type一共有9中類型,只介紹常用的4種:
SIMPLE: 簡單的 select 查詢,不使用 union 及子查詢
PRIMARY: 最外層的 select 查詢
UNION: UNION 中的第二個(gè)或隨后的 select 查詢,不依賴于外部查詢的結(jié)果集
DERIVED: 用于 from 子句里有子查詢的情況。 mysql會(huì)遞歸執(zhí)行這些子查詢, 把結(jié)果放在臨時(shí)表里。
Table:輸出行所引用的表
Type:從有到差的順序如下:
System-->const-->eq_ref-->ref-->ref_or_null-->index_merge-->unique_subquery-->index_subquery-->range-->index-->all.
各自的含義如下:
system: 表僅有一行(=系統(tǒng)表)。這是 const 連接類型的一個(gè)特例。
const: const 用于用常數(shù)值比較 PRIMARY KEY 時(shí)。當(dāng) 查詢的表僅有一行時(shí),使用 System。
eq_ref: 從前面的表中,對(duì)每一個(gè)記錄的聯(lián)合都從表中讀取一個(gè)記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時(shí)使用
ref: 連接不能基于關(guān)鍵字選擇單個(gè)行,可能查找 到多個(gè)符合條件的行。 叫做 ref 是因?yàn)樗饕?跟某個(gè)參考值相比較。
這個(gè)參考值或者是一 個(gè)常數(shù),或者是來自一個(gè)表里的多表查詢的 結(jié)果值。
ref_or_null: 如同 ref, 但是 MySQL 必須在初次查找的結(jié)果 里找出 null 條目,然后進(jìn)行二次查找。
index_merge: 說明索引合并優(yōu)化被使用了。
unique_subquery: 在某些 IN 查詢中使用此種類型,而不是常規(guī)的 ref:valueIN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery: 在 某 些 IN 查 詢 中 使 用 此 種 類 型 , 與 unique_subquery 類似,但是查詢的是非唯一 性索引
range: 只檢索給定范圍的行,使用一個(gè)索引來選擇 行。key 列顯示使用了哪個(gè)索引。
當(dāng)使用=、 <>、>、>=、<、<=、IS NULL、
從上述對(duì)列名進(jìn)行介紹,你對(duì)性能檢測(cè)結(jié)果有一個(gè)大概的了解了吧.其中type為all的地方,都是需要進(jìn)行優(yōu)化的地方.
在對(duì)sql語句的性能檢測(cè)最少也應(yīng)該到達(dá)range,這樣才可以忍受.
目前我的技術(shù)水平和項(xiàng)目要求,主要考慮type這列的優(yōu)化。既然檢測(cè)出來的結(jié)果有all ,那么就需要優(yōu)化,具體怎么優(yōu)化,請(qǐng)看我下期博客。