7.2.9 MySQL 如何優化 ORDER BY
在一些情況下,MySQL可以直接使用索引來滿足一個 ORDER BY 或 GROUP BY 子句而無需做額外的排序。
盡管 ORDER BY 不是和索引的順序准確匹配,索引還是可以被用到,只要不用的索引部分和所有的額外的 ORDER BY 字段在 WHERE 子句中都被包括了。下列的幾個查詢都會使用索引來解決 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,盡管它會使用索引來找到記錄來匹配 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)。