订购带限制和偏移的分页

问题描述 投票:0回答:1

如果我有3000行。

第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
....

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

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

sql database postgresql pagination
1个回答
0
投票
SELECT * FROM my_table id OFFSET 0 LIMIT 1000;

在性能级别上,这意味着我们要求数据库引擎每次都找出自己从哪里开始。这意味着它必须知道查询偏移之前的每条记录,因为它们在查询(删除等)之间可能不同。因此偏移数越高,整体查询所需的时间越长。

替代方案

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

SELECT * FROM my_table WHERE id > 999 LIMIT 1000;

这样,DB的引擎将基于有效的索引键确切地知道从哪里开始,并且不必考虑范围之前的任何记录。这将全部转化为快速查询。

© www.soinside.com 2019 - 2024. All rights reserved.