盡管 ORDER BY 不是和索引的順序準確匹配,索引還是可以被用到,只要不用的索引部分和所有的額外的 ORDER BY 字段在 WHERE 子句中都被包括了。
使用索引的MySQL Order By 下列的幾個查詢都會使用索引來解決 ORDER BY 或 GROUP BY 部分:
復制代碼 代碼如下:
SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2; SELECT * FROM t1 WHERE key_part1=constant GROUP BY key_part2; SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC; SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;
不使用索引的MySQL Order By 在另一些情況下,MySQL無法使用索引來滿足 ORDER BY,盡管它會使用索引來找到記錄來匹配 WHERE 子句。這些情況如下: * 對不同的索引鍵做 ORDER BY : SELECT * FROM t1 ORDER BY key1, key2; * 在非連續的索引鍵部分上做 ORDER BY: SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2; * 同時使用了 ASC 和 DESC: SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC; * 用于搜索記錄的索引鍵和做 ORDER BY 的不是同一個: SELECT * FROM t1 WHERE key2=constant ORDER BY key1; * 有很多表一起做連接,而且讀取的記錄中在 ORDER BY 中的字段都不全是來自第一個非常數的表中(也就是說,在 EXPLAIN 分析的結果中的第一個表的連接類型不是 const)。 * 使用了不同的 ORDER BY 和 GROUP BY 表達式。 * 表索引中的記錄不是按序存儲。例如,HASH 和 HEAP 表就是這樣。
通過執行 EXPLAIN SELECT ... ORDER BY,就知道MySQL是否在查詢中使用了索引。如果 Extra 字段的值是 Using filesort,則說明MySQL無法使用索引。詳情請看"7.2.1 EXPLAIN Syntax (Get Information About a SELECT)"。當必須對結果進行排序時,MySQL 4.1以前 它使用了以下 filesort 算法: