GraphQL分页:Relay Cursor与Offset对比
概览
- Cursor 基于稳定排序字段生成不重复位置指针;Offset 依赖固定顺序下的行偏移。
- Relay Connection 规范定义
edges、pageInfo、first/after 等语义,适合数据持续变更的场景。
技术参数(已验证)
- Relay Connection 规范:
edges{node,cursor} 与 pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor}。
- 稳定排序:使用复合键如
created_at,id 保证新增/删除不会导致游标漂移;保持全局唯一与确定性顺序。
- 游标编码:常见做法 Base64;包含排序键及方向;前后向分页分别用
after/before 与 first/last。
- 查询性能:Offset 在大型表上会触发
OFFSET N 扫描与回表;Cursor 可利用索引范围扫描、覆盖索引,降低延迟。
- 读写一致性:游标分页建议在只读视图或时间点快照下执行,避免跨页重复或遗漏。
实战清单
- 优先选择游标分页并显式稳定排序;同时提供前后向分页能力。
- 为游标字段建立联合索引;返回完整
pageInfo 以利前端导航。
- 对高并发写入场景启用时间点快照或乐观并发控制,保障跨页一致性。
发表评论 取消回复