我一直想知道ORDER BY是否有效,因为我相信它不可避免地需要整个数据库扫描,即使订购字段已编入索引。
例如,如果我按created_at命令并限制10.我认为,因为数据库无法知道我将通过created_at先验顺序,它必须对整个数据进行排序并返回前10个项目。当然,如果我们在created_at上有一个索引,事情可能会更好。
然而,即使有索引,我认为我们仍然可能遇到麻烦。例如,我想按字段的函数排序,比如说(年龄^ 2-age-10)。即使我们索引了age字段,数据库也无法知道我将使用哪个函数,所以它必须计算所有行上的sqrt。
我错了吗?无论如何,任何人都可以向我解释ORDER BY背后的工作流程吗?
答案 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的人通常不会进行这样的转换。