键集分页(Keyset Pagination)用上一页末项的排序键定位下一段记录,避免为深分页反复跳过大量前序结果。
与游标接口的关系
游标是 API 定位后续结果的一种接口形式,可以封装排序键,也可以使用服务端保存的状态;键集分页则是按排序键定位下一批结果的查询方法。两者经常结合,但不等同。
稳定排序
假设按 created_at、id 升序,可把末项两列作为游标,并请求排序键大于该值的下一批记录。必须有唯一的最终排序键,且索引应支持过滤与排序。
游标不是单纯的页码替代编码,还应绑定筛选条件和排序方式。排序键被修改、数据被插入或删除时,需明确能接受怎样的跨页变化;需要一致快照时另行设计。
与 OFFSET 的取舍
OFFSET 便于跳到指定页,但数据库仍需处理被跳过的记录,大偏移可能变慢。键集分页更适合连续翻页,任意页跳转及准确总页数通常更难提供。
参考资料以 PostgreSQL LIMIT/OFFSET 的执行及排序约束为基础,游标方案为据此组织的工程实践。