我想运行一个简单的查询来获取表中最旧的“n”条记录。 (它有一个 creation_date 列)。
如果不使用“order-by”,我怎么能得到它呢?这是一个非常大的表,对整个表使用 order by 只得到“n”条记录并不那么令人信服。
(假设 n << 表的大小)
最佳答案
当您关心性能时,您可能不应该过早放弃使用 order by。
这样的查询可以作为由适当索引支持的 Top-N 查询来实现,它运行得非常快,因为它不需要对整个表进行排序,甚至不需要对选择的行进行排序,因为数据已经在索引。
例子:
select *
from table
where A = ?
order by creation_date
limit 10;
如果没有适当的索引,如果你有很多数据,它会很慢。但是,如果您创建这样的索引:
create index test on table (A, creation_date );
查询将能够以正确的顺序开始获取行,无需排序,并在达到限制时停止。
Recipe:将 where 列放在索引中,然后按列排序。
如果没有where子句,就把order by放到索引里。 order by 必须匹配索引定义,尤其是在存在混合的 asc/desc 顺序时。
带索引的 Top-N 查询是性能之王——确保使用它们。
我有几个链接供进一步阅读(都是我的):
How to use index efficienty in mysql query
http://blog.fatalmind.com/2010/07/30/analytic-top-n-queries/ (以 Oracle 为中心)
http://Use-The-Index-Luke.com/ (尚未涵盖 Top-N 查询,但将在 2011 年推出)。
关于mysql - 优化查询而不是使用 order by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4601323/