文章出處
文章列表
在某些場景,在不做額外的排序情況下,MySQL 可以使用索引來滿足 ORDER BY
子句的優化。雖然 ORDER BY
并不完全精確地匹配索引,但是索引還是會被使用,只要在WHERE
子句中,所有未被使用的那部分索引(一個索引多個字段的情況)以及所有ORDER BY
字段都是一個常量就沒問題。下面這些查詢語句,使用了索引來對 ORDER BY
部分進行優化:
SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;(注意,類似key_part1、key_part2屬于同一個聯合索引的字段) SELECT * FROM t1 WHERE key_part1 = constant ORDER 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; SELECT * FROM t1 WHERE key_part1 > constant ORDER BY key_part1 ASC; SELECT * FROM t1 WHERE key_part1 < constant ORDER BY key_part1 DESC; SELECT * FROM t1 WHERE key_part1 = constant1 AND key_part2 > constant2 ORDER BY key_part2;
以上查詢語句的ORDER BY
子句都能夠使用索引進行優化排序效率。然而,在某些場景,雖然在WHERE
子句中依然可用索引去匹配的行,但并不能那么幸運的使用上索引去對ORDER BY
子句進行優化。下面這些場景就是這種情況:
這個查詢語句中,ORDER BY 的字段是兩個不同的單獨索引: SELECT * FROM t1 ORDER BY key1, key2; 這個查詢語句中,ORDER BY 的字段是聯合索引中兩個不連續的索引字段(大家知道,聯合索引是不能跳開來使用字段的,例如key(column1,column2)這個聯合索引,select .. from tb where
或column1=... [and column2=...]都使用了索引([]內的條件可選),然而select .. from tb where column2=...是用不了索引的): SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2; 這個查詢語句中,ORDER BY 混合使用了降序DESC和升序ASC,也是不行的: SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
這個查詢語句中,在WHERE子句中用來檢索匹配行的索引與ORDER BY使用的索引不是同一個索引,也不行:
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
這個查詢語句中,ORDER BY 子句使用了一個條件表達式不同于索引字段名稱:
SELECT * FROM t1 ORDER BY ABS(key);
SELECT * FROM t1 ORDER BY -key;
未完待續
翻譯自:
http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html
翻譯者:http://www.cnblogs.com/langtianya/ 轉載請注明出處。
英文一般,翻譯得不好的地方,多多賜教。
文章列表
全站熱搜