按列排序应该有索引吗?


Answers:


26

是的,MySQL可以在某些情况下在ORDER BY的列上使用索引。但是,MySQL不能将索引用于混合的 ASC,DESC顺序(SELECT * FROM foo ORDER BY bar ASC, pants DESC)。共享您的查询和CREATE TABLE语句将帮助我们更具体地回答您的问题。

有关如何优化ORDER BY子句的提示:http : //dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

编辑2012-01-21 8:53 AM

关于我在ORDER BY中使用带有混合ASC / DESC的索引的陈述的来源存在疑问。从ORDER BY Optimization文档中:

在某些情况下,MySQL不能使用索引来解析ORDER BY,尽管它仍然使用索引来查找与WHERE子句匹配的行。这些情况包括:

...

您混合使用ASC和DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 ASC;

...

另外,DESC关键字在CREATE INDEX中是没有意义的

index_col_name规范可以以ASC或DESC结尾。这些关键字允许将来用于指定升序或降序索引值存储的扩展。目前,它们已被解析但被忽略;索引值始终按升序存储。


3
“ MySQL无法将索引用于混合的ASC,DESC”。为此参考?
ypercubeᵀᴹ

CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);应该管用。
Frank Heikens 2012年

我的资料是我的答案中链接的mysql文档。搜索“混音”。
亚伦·布朗

3
MySQL在CREATE INDEX中解析asc和Desc,但忽略它们。索引始终按升序存储。dev.mysql.com/doc/refman/5.5/en/create-index.html
亚伦·布朗

1
新的MySQL 8.0:现在可以使用的混合物ASCDESC 如果INDEX具有相同的混合物。
瑞克·詹姆斯

4

对于任何想知道与PostgreSQL有关的答案的人,答案是肯定的,将使用索引。根据PostgreSQL文档,查询计划者将“考虑通过扫描与规范匹配的可用索引,或者通过按物理顺序扫描表并进行显式排序来满足ORDER BY规范。” 这意味着,如果有计划者可以使用的索引,则会这样做,而在检索到匹配的行之后,便会返回进行排序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.