概述
OFFSET 分页在深页是性能陷阱,在并发写入下又是正确性陷阱。游标分页直接定位到边界,使延迟与结果集都保持稳定。
关键步骤
- 按唯一键(如 created_at, id)排序,并把最后一行作为游标。
- 对游标做不透明编码,避免客户端构造任意游标。
- 建立与排序列完全匹配的复合索引。
- 首页省略 WHERE,既正确又使用索引。
验证
- 首页返回最新行。
- 按游标翻页返回连续的下一批且无缺口。
- 深页开销与页码无关,保持恒定。
- 排序列上的并列值由附加键打破。
注意事项
- 游标分页无法跳到任意页码,适合信息流而非页码式界面。
- 游标与排序顺序绑定,改变排序会使未使用的游标失效。
适用范围
本条目围绕「为 SQL 接口添加游标分页」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
SELECT id, title, created_at
FROM posts
WHERE (created_at, id) < ($1, $2)
ORDER BY created_at DESC, id DESC
LIMIT 20;