我在表中添加了用于搜索结果的索引。我按ASC或DESC顺序显示结果。所以那列应该有索引吗?我在那张桌子上还有2个索引。对该列建立索引或不建立索引会对性能产生怎样的影响?
我在表中添加了用于搜索结果的索引。我按ASC或DESC顺序显示结果。所以那列应该有索引吗?我在那张桌子上还有2个索引。对该列建立索引或不建立索引会对性能产生怎样的影响?
Answers:
是的,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结尾。这些关键字允许将来用于指定升序或降序索引值存储的扩展。目前,它们已被解析但被忽略;索引值始终按升序存储。
CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);
应该管用。
ASC
和DESC
如果在INDEX
具有相同的混合物。
对于任何想知道与PostgreSQL有关的答案的人,答案是肯定的,将使用索引。根据PostgreSQL文档,查询计划者将“考虑通过扫描与规范匹配的可用索引,或者通过按物理顺序扫描表并进行显式排序来满足ORDER BY规范。” 这意味着,如果有计划者可以使用的索引,则会这样做,而在检索到匹配的行之后,便会返回进行排序。