订购带限制和偏移的分页

时间:2014-07-04 16:19:41

标签: sql database postgresql pagination

如果我有3000行。

Page 1

Select * from clients order by id limit 1000 offset 0;

第2页

Select * from clients order by id limit 1000 offset 1000;

第3页

Select * from clients order by id limit 1000 offset 2000;

我的问题是关于postgres的内部处理。

我正在使用order子句来避免重复的条目和分页的一致性。

Page 1 1000 rows
Page 2 1000 rows+1000 rows
Page 3 1000 rows + 1000 rows + 1000 rows
....

因此,页码越高,所需的时间越长。这是正确和正常的吗?还是有另一种方法?

偏移和订单总是需要知道以前的结果,对吗?

1 个答案:

答案 0 :(得分:0)

SELECT * FROM my_table id OFFSET 0 LIMIT 1000;

就性能而言,这意味着我们正在要求数据库引擎每次都自行确定从哪里开始。 这意味着它必须知道查询的偏移量之前的每条记录,因为查询之间的记录可能有所不同(删除等)。 因此,偏移量越高,整个查询所需的时间就越长。

替代解决方案

相反,要跟踪查询脚本中的偏移量,请考虑跟踪上一个结果集中最后一条记录的主键

SELECT * FROM my_table WHERE id > 999 LIMIT 1000;

通过这种方式,数据库引擎将基于有效的索引键准确地知道从何处开始,而不必在范围之前考虑任何记录。所有这些都将转换为快速查询。