偏移/限制性能优化



我有一个结构如下的表:

  • Id(serial int)(此上的索引)
  • 帖子(文本)
  • CreationDate(DateTime)(对此的描述索引)

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

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

当记录很少(低于100万)时,性能是可以承受的,但当表增长时,会有明显的差异。

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

由于我的Id是自动递增的(如此可预测),我想的另一个选择是使用类似的东西

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

但这似乎让事情变得复杂,我必须一直得到记录的数量,此外,不能保证我总是会得到15条记录(例如,如果其中一条帖子被删除,ID不再按"直线"顺序排列)。

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

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

您可以选择:

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

其中,我更喜欢x > idLIMIT。只要记住你看到的最后一个身份证,然后索要下一个。如果您有一个单调递增的序列,这将是简单、可靠的,并且对于简单的查询,它将是高效的。

相关内容

  • 没有找到相关文章

最新更新