标准答案
- LIMIT 20 OFFSET 100000 通常仍需要读取或跳过前十万行,深页成本会随 OFFSET 增长。
- 游标分页用最后一条记录的排序键继续查询,例如 created_at 与 id 的组合,而不是传递页码。
- 排序必须稳定且全序;只按 created_at 排序会在同一时间戳下漏数据或重复数据,需要再加唯一 ID。
- 游标应携带必要的过滤条件版本或被签名,避免用户篡改后跨越数据范围。
- 随机跳转到第 N 页、显示总页数和历史数据任意定位仍可能需要 OFFSET、搜索或离线索引,不能强行只用游标。
题目解析
游标分页解决的是连续浏览,而不是万能列表协议。对于信息流、订单流水和日志,它能在新数据插入时维持较稳定的向后遍历;对于后台管理员需要直接跳页到第 500 页的场景,则要重新评估交互和索引方案。
游标条件必须和 ORDER BY 完全一致。例如按 created_at DESC, id DESC 排序,下一页条件应正确处理 created_at 更小,或时间相同且 id 更小的记录,且索引顺序要能支持这条范围查询。
代码示例
以创建时间和主键组成游标,避免同一时间戳的记录被跳过或重复。
sql
SELECT id, created_at, status
FROM orders
WHERE tenant_id = ?
AND (created_at < ? OR (created_at = ? AND id < ?))
ORDER BY created_at DESC, id DESC
LIMIT 20;常见误区
- 游标只保存时间戳,同一毫秒或同一秒创建的多条数据出现重复或遗漏。
- 排序字段和游标条件不一致,翻页时记录顺序发生跳动。