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