标准答案
- 页码分页通常使用 offset 和 limit,易理解且支持跳到任意页,但深页需要跳过大量记录,并且并发写入时容易出现重复或漏读。
- 游标分页使用上一页最后一条记录的稳定排序键,例如 createdAt 加 id,数据库可以从游标继续扫描,适合大表和无限滚动。
- 时间线分页以时间或事件序列为边界,适合消息流、动态流和审计流;需要定义新数据插入时是固定快照还是允许内容变化。
- 排序必须有唯一的次级键,否则相同时间或相同分数的数据在翻页时会不稳定。
- 游标应保持不透明并受到签名或编码保护,服务端负责解析和校验,不让客户端随意拼接底层查询条件。
题目解析
分页不是单纯的 SQL 写法,而是用户看到的数据一致性约定。订单列表、搜索结果和聊天记录对重复、漏读、跳页的容忍度不同。
索引要与排序和过滤条件匹配。没有合适索引时,游标分页也可能退化为低效扫描。
常见误区
- 对千万级列表仍使用很大的 offset,并认为加大数据库连接池能解决问题。
- 游标只使用时间戳,没有同时间的唯一排序键。
- 把数据库主键或原始 SQL 条件直接暴露为可修改的游标。