【问题标题】:offset/limit performance optimization偏移/限制性能优化
【发布时间】:2013-12-03 09:19:40
【问题描述】:

我有一个结构如下的表:

  • Id (serial int) (关于这个的索引)
  • 发布(文字)
  • ...
  • CreationDate (DateTime) (Desc index on this)

我需要实现分页。我的简单查询如下所示:

SELECT Id, Post, etc FROM Posts ORDER BY CreationDate desc OFFSET x LIMIT 15

当记录很少(低于 100 万)时,性能在某种程度上可以忍受,但当表增长时,就会有明显的差异。

跳过配置数据库设置(如缓存大小、工作内存、成本、共享内存等)的好处......可以做些什么来提高性能以及使用 Postgres 进行分页的最佳实践是什么。有类似的问题问here,但我不确定这是否也适用于我的情况。

由于我的Id 是自动递增的(如此可预测),我想的其他选择之一就是拥有这样的东西

SELECT Id, Post...FROM Posts WHERE Id > x and Id < y

但这似乎使事情变得复杂,我必须一直获取记录数,而且不能保证我总是会得到 15 条记录(例如,如果其中一个帖子已被删除并且 ID 不在“直”序列了)。

我也在考虑 CURSOR,但如果我没记错的话,CURSOR 会保持连接打开,这在我的情况下是不可接受的。

【问题讨论】:

    标签: asp.net database postgresql pagination


    【解决方案1】:

    分页很难; RDBMS 模型不太适合带有状态滚动的大量短期查询。正如您所指出的,资源使用率往往过高。

    您有以下选择:

    • LIMITOFFSET
    • 使用光标
    • 将结果复制到临时表或 memcached 或类似表中,然后从那里读取它
    • x &gt; idLIMIT

    其中,我更喜欢x &gt; idLIMIT。只需记住您看到的最后一个 ID 并要求下一个。如果你有一个单调递增的序列,这将是简单、可靠的,并且对于简单的查询它会很有效。

    【讨论】:

    • 感谢您的回答。我同意 x > id 将是最有效的选择,假设大多数人无论如何都会检查最新数据。但如果我没记错的话,那就有问题了,因为可以不断地向表中插入并且 Id 正在增加。这将意味着我必须一直获取最大 id 并且仍然不能依赖它,就好像某些帖子被删除一样,id 不会是连续的(我的意思是 id 之间的步长并不总是 1)......跨度>
    • @NDeveloper 你在分页,对吧?您只需要记住您上次在会话中看到的 ID。所以(比如说)你首先运行SELECT ... FROM ... WHERE id &gt; 0 ORDER BY id LIMIT 20。您可能会得到一个 ID 为 1、3、4、5、... 28 的结果集。因此,对于下一页,您的下一个查询是 SELECT ... FROM ... WHERE id &gt; 28 ORDER BY id LIMIT 1。如果您希望主要进行 reverse 分页,那么您的第一个查询将作为 ... ORDER BY id DESC LIMIT 20 进行,下一个查询将作为 WHERE id &gt; 99123 ORDER BY id DESC LIMIT 20(其中 99123 是您在上次查询中看到的最低 ID)。跨度>
    • 是的,你是对的,这是有道理的。这种方法的唯一问题是,如果 Id 不连续,则同一记录可能会出现多次。
    • @NDeveloper 如果 ID 不是连续的,那么这不是一个有用的方法。只有当您可以ORDER BY 一个唯一的、非重复的分页键时,这才是好的。您可以使用多个键,如果您想先按非唯一键排序,然后使用唯一键作为决胜局。
    • 实际上 ID 是独一无二的...我知道这是如何工作的...这是一个示例,假设我有 SELECT...ORDER BY ID desc 限制 20...和我的这里的最低 ID 是 99123 ...所以下一个选择(第 2 页)应该看起来像 SELECT...WHERE ID
    猜你喜欢
    • 2022-01-12
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2013-09-12
    • 2011-07-20
    相关资源
    最近更新 更多