1. 程式人生 > 其它 >mysql explain extra理解詳解

mysql explain extra理解詳解

http://www.itxm.cn/post/16521.html

Extra表示附加資訊,常見的有如下幾種(也按查詢效率從高到低排列):

Usingindex

表示使用索引,如果只有 Using index,說明他沒有查詢到資料表,只用索引表就完成了這個查詢,這個叫覆蓋索引如果同時出現Usingwhere,代表使用索引來查詢讀取記錄,也是可以用到索引的,但是需要查詢到資料表。

using index & using where

查詢使用了索引,但是需要的資料都在索引列中能找到,所以不需要回表查詢資料

Using index condition

在5.6版本後加入的新特性(Index Condition Pushdown),會先條件過濾索引,過濾完索引後找到所有符合索引條件的資料行,隨後用 WHERE 子句中的其他條件去過濾這些資料行,也就是說需要回表查詢

Usingwhere

表示優化器需要通過索引回表查詢資料

Usingfilesort

Using filesort表示在索引之外,需要額外進行外部的排序動作。導致該問題的原因一般和order by有者直接關係,一般可以通過合適的索引來減少或者避免。

示例

explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_id LIMIT 0, 5

user_id 和 item_id 分別建立一個索引,對此語句MySQL選擇了 user_id索引,那麼 item_id 的索引沒有起到任何用處。當排序時記錄數較多,記憶體中的排序 buffer滿了,只能 Using filesort 進行外部排序。
解決方式為對這兩列建立組合索引。

explain SELECT * FROM table_item WHERE user_id = 2 and user_age > 20 ORDER BY item_id LIMIT 0, 5

建立組合索引(user_id, user_age, item_id),看似非常完美。但由於user_age規則不是確定值,使用該組合索引的話實際上需要先按索引找出一個個user_age下的東西后再對其進行排序,仍然會filesort。
解決方式是使用組合索引(user_id, item_id),對排序好的item_id再過濾到不滿足user_age > 20的條目,不會出現filesort。

explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_attr desc, item_id LIMIT 0, 5

建立了組合索引(user_id, item_attr, item_id),因為item_attr是降序而item_id是升序,從而仍然需要外部排序。
如果item_attr和item_id都是升序或者都是降序,則不會出現filesort;建立組合索引(user_id, item_attr desc, item_id)現象依舊。
Mysql5.1線上文件“13.1.4. CREATE INDEX語法”中提到:“一個index_col_name規約可以以ASC或DESC為結尾。這些關鍵詞將來可以擴充套件,用於指定遞增或遞減索引值儲存。目前,這些關鍵詞被分析,但是被忽略;索引值均以遞增順序儲存。”
可以看出無法通過修改索引來避免這個filesort,只能是如果可能的話修改查詢的排序條件。

Usingtemporary

表示為了得到結果,使用了臨時表,這通常是出現在多表聯合查詢,結果排序的場合。

轉http://www.itxm.cn/post/16521.html