← 中文资源

简体中文版本

为 SQL 接口添加游标分页

按稳定的排序键分页而非 OFFSET,使深分页保持高性能,且在数据变动时既不跳行也不重复。

阅读英文原文

概述

OFFSET 分页在深页是性能陷阱,在并发写入下又是正确性陷阱。游标分页直接定位到边界,使延迟与结果集都保持稳定。

关键步骤

  1. 按唯一键(如 created_at, id)排序,并把最后一行作为游标。
  2. 对游标做不透明编码,避免客户端构造任意游标。
  3. 建立与排序列完全匹配的复合索引。
  4. 首页省略 WHERE,既正确又使用索引。

验证

  • 首页返回最新行。
  • 按游标翻页返回连续的下一批且无缺口。
  • 深页开销与页码无关,保持恒定。
  • 排序列上的并列值由附加键打破。

注意事项

  • 游标分页无法跳到任意页码,适合信息流而非页码式界面。
  • 游标与排序顺序绑定,改变排序会使未使用的游标失效。

适用范围

本条目围绕「为 SQL 接口添加游标分页」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

SELECT id, title, created_at
FROM posts
WHERE (created_at, id) < ($1, $2)
ORDER BY created_at DESC, id DESC
LIMIT 20;