如果我有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
....
因此,页码越高,所需的时间越长。这是正确和正常的吗?还是有另一种方法?
偏移和订单总是需要知道以前的结果,对吗?
SELECT * FROM my_table id OFFSET 0 LIMIT 1000;
在性能级别上,这意味着我们要求数据库引擎每次都找出自己从哪里开始。这意味着它必须知道查询偏移之前的每条记录,因为它们在查询(删除等)之间可能不同。因此偏移数越高,整体查询所需的时间越长。
替代方案
相反,为了跟踪查询脚本中的偏移量,请考虑在前一个结果集中跟踪最后一条记录的主键
SELECT * FROM my_table WHERE id > 999 LIMIT 1000;
这样,DB的引擎将基于有效的索引键确切地知道从哪里开始,并且不必考虑范围之前的任何记录。这将全部转化为快速查询。