ORDER BY耗时吗?

时间:2014-05-24 22:26:14

标签: sql database

我一直想知道ORDER BY是否有效,因为我相信它不可避免地需要整个数据库扫描,即使订购字段已编入索引。

例如,如果我按created_at命令并限制10.我认为,因为数据库无法知道我将通过created_at先验顺序,它必须对整个数据进行排序并返回前10个项目。当然,如果我们在created_at上有一个索引,事情可能会更好。

然而,即使有索引,我认为我们仍然可能遇到麻烦。例如,我想按字段的函数排序,比如说(年龄^ 2-age-10)。即使我们索引了age字段,数据库也无法知道我将使用哪个函数,所以它必须计算所有行上的sqrt。

我错了吗?无论如何,任何人都可以向我解释ORDER BY背后的工作流程吗?

2 个答案:

答案 0 :(得分:3)

如果索引的排序顺序与ORDER BY子句中指定的顺序相同,则数据库不需要执行排序操作。查询优化器会查找可以加快查询速度的索引。它分析您的SQL查询,在ORDER BY子句的情况下,查找具有相同顺序的索引。有关详细信息,请参阅Indexing ORDER BY

某些数据库引擎允许索引计算列,这将涵盖您提到的情况。

答案 1 :(得分:0)

理论上,数据库优化器在确定查询计划时可以考虑limit子句。这对于limit 1查询最明显有用,只需跟踪哪一行具有order by中列的极值即可实现。同样的想法可以扩展到更大的limit尺寸。

在实践中,我认为大多数数据库在限制大于1时都不会实现此优化。有些可能针对特殊情况limit 1(或top 1或任何正确的语法是)。

索引可用于order by。通常,索引中的列需要与索引中的相应列完全匹配。 SQL优化器通常不够智能,无法识别简单的转换。另一方面,编写SQL的人通常不会进行这样的转换。