mysql - 优化查询而不是使用 order by

标签 mysql sql

我想运行一个简单的查询来获取表中最旧的“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/

相关文章:

mysql - 是否为了性能/集中而合并表

MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题

sql - 数据库引擎内部结构

php - 在 HTML 表单上插入数据库提交

c# - 为什么 Reverse() 不能转换成 SQL?

mysql - 如何将Excel文件导入MySQL Workbench?

mysql - 如何通过为自动递增列传递值 ''来将数据插入MySQL?

php - 在动态 PHP 到 XML 脚本中正确转义 &

sql - block 过程 PL/SQL 与 Oracle

php - 在 PHP MySQL 搜索中返回 5 个结果