我有一个结构如下的表:
- 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模型不太适合于具有状态滚动的大量短暂查询。正如你所指出的,资源使用率往往过高。
您可以选择:
LIMIT
和OFFSET
- 使用光标
- 将结果复制到临时表或memcached或类似表中,然后从中读取
x > id
和LIMIT
其中,我更喜欢x > id
和LIMIT
。只要记住你看到的最后一个身份证,然后索要下一个。如果您有一个单调递增的序列,这将是简单、可靠的,并且对于简单的查询,它将是高效的。