文章出處

在某些場景,在不做額外的排序情況下,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/ 轉載請注明出處。

英文一般,翻譯得不好的地方,多多賜教。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()