【问题标题】:Fastest way to SELECT through MySQL table records backwards from a certain row?从某一行向后选择 MySQL 表记录的最快方法?
【发布时间】:2015-03-18 05:04:14
【问题描述】:

拥有超过 1800 万行的表:

SELECT * FROM tbl WHERE id > 10000000 LIMIT 30

耗时 0.0724 秒。

SELECT * FROM tbl WHERE id < 10000000 ORDER BY id DESC LIMIT 30

耗时 0.0565 秒。

这是在 MySQL 中某一行之前选择一定数量记录的最快方法吗?

这似乎已经足够好了,但 MySQL 不是必须先按降序排列这 1000 万行,然后再选择 30 行吗?

我问这是因为我不太确定我提出的这个问题。它看起来确实有效且速度足够快,但看看语法语义,我不太确定。

MySQL 是否足够智能,可以知道它不必对所有这 1000 万行进行排序?

或者有没有更好的方法来实现这一点?

【问题讨论】:

  • 如果您不关心某个 id 之前的哪 30 行使用没有 ORDER BY 的变体,它应该更快..除了如果那是主键,行已经排序,所以在第二个查询中您可能进行范围扫描。我不确定。在这些查询之前添加一个 EXPLAIN 并使用结果编辑您的问题。

标签: mysql performance select


【解决方案1】:

如果您在 id 列上有索引(或将其作为主键的初始部分),则根本不需要对行进行排序

它会简单地使用那个索引,给出已经排序的数据,然后抓取前三十个元素。

是的,如果它不能有效地按排序顺序检索行,它可能必须获取批次然后排序。但这将是相当糟糕的 DBMS 设计。

【讨论】:

  • ORDER BY id DESC LIMIT 30 中的向后选择是这样吗?我以为索引只对默认顺序 ASC 有用?
  • @kavoir.com:一个简单的单列索引可以很容易地以相反的顺序扫描。您可能会遇到复合键的问题,但这不适用于此处。
  • InnoDB 索引采用 B+Tree 结构。这允许钻入树中找到一个特定的行,然后非常有效地链接到“下一个”或“上一个”行。回复:复合索引:ORDER BY a DESC, b DESC 也有效,但不是ORDER BY a ASC, b DESC
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多