偏移/极限性能优化(offset/limit performance optimization)

2019-10-19 02:09发布

我有类似结构的表格:

  • ID(序列INT)(该指标)
  • 帖子(文本)
  • ...
  • CreationDate(日期时间)(在此说明指数)

我需要实现分页。 我简单的查询是这样的:

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

当有几条记录(低于1万)的表现是有点忍受,但是当表的增长有一个明显的区别。

跳绳的事实,有良好的配置像缓存大小,工作存储器,成本,共享MEM,等等...什么可以做,以提高性能和什么是使用的Postgres分页的最佳实践DB设置。 有类似要求的东西在这里 ,但我不知道这是否可以在我的情况下被应用过。

由于我的Id是自动递增的(因此可以预测)我在想其他选项之一是有这样的事

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

但是,这似乎使事情变得复杂,我得记录计数所有的时间,除了它不能保证,我总是会得到15条记录(例如,如果该职位之一已被删除,ID是不是“直线”序列了)。

我想了解光标的太多,但如果我没有记错光标将保持连接打开,这是不是在我的情况下,可以接受的。

Answer 1:

分页是硬; RDBMS的模式不适合于大量的具有状态滚动短命查询。 正如你提到的,资源利用趋于过高。

你有选择:

  • LIMITOFFSET
  • 使用游标
  • 复制结果到一个临时表或进memcached的或类似的,然后从那里阅读它
  • x > idLIMIT

其中,我更喜欢x > idLIMIT 。 只要记住你看到的最后一个ID,并要求下一个。 如果你有一个单调递增序列,这将是简单,可靠,简单查询这将是有效的。



文章来源: offset/limit performance optimization