【发布时间】:2011-01-05 06:15:25
【问题描述】:
我想运行一个简单的查询来获取表中的“n”条最旧的记录。 (它有一个 creation_date 列)。
如果不使用“order-by”,我怎样才能得到它。这是一个非常大的表,并且对整个表使用 order by 来仅获取“n”条记录并不是那么令人信服。
(假设n
【问题讨论】:
我想运行一个简单的查询来获取表中的“n”条最旧的记录。 (它有一个 creation_date 列)。
如果不使用“order-by”,我怎样才能得到它。这是一个非常大的表,并且对整个表使用 order by 来仅获取“n”条记录并不是那么令人信服。
(假设n
【问题讨论】:
当您关心性能时,您可能不应该过早放弃使用顺序。
这样的查询可以实现为由适当索引支持的 Top-N 查询,运行速度非常快,因为它不需要对整个表进行排序,甚至不需要对选定的行进行排序,因为数据已经在索引。
示例:
select *
from table
where A = ?
order by creation_date
limit 10;
如果您有大量数据,如果没有适当的索引,它会很慢。但是,如果您创建这样的索引:
create index test on table (A, creation_date );
查询将能够以正确的顺序开始获取行,无需排序,并在达到限制时停止。
配方:将 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 年推出)。
【讨论】:
我之前没有测试过这个概念,但尝试在 creation_date 列上创建一个索引。哪个会自动对行进行升序排序。然后您的选择查询可以使用 orderby creation_date desc 和 Limit 20 来获取前 20 条记录。数据库引擎应该意识到索引已经完成了排序工作并且实际上不需要排序,因为索引已经在保存时对其进行了排序。它需要做的就是从索引中读取最后 20 条记录。
值得一试。
【讨论】:
在creation_date上创建一个索引并使用order by creation_date asc|desc limit n查询,响应会非常快(实际上不能更快)。对于“最新 n”场景,您需要使用 desc。
如果您希望对此查询有更多限制(例如where state='LIVE'),那么查询可能会变得非常慢,您需要重新考虑索引策略。
【讨论】:
如果您对某些数据进行分组,您可以使用Group By,然后使用Having 子句选择特定记录。
【讨论】: