You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于游标的UUID分页方案:获取指定ID后的X条数据

完美解决UUID主键的游标分页问题

哈哈,这个UUID分页的坑我可太熟了!之前踩过OFFSET的大坑——新数据一插,页面导航时老记录就跑到下一页去了,后来用键集(游标)分页完美解决,正好适配你的需求!

核心思路:用「排序键+主键」替代OFFSET

UUID没法像自增ID那样用>做数值比较,但只要我们依赖稳定的排序规则(比如创建时间created_at,或者时间有序的UUIDv1),就能通过游标记录的键值来精准过滤后续数据,完全避开OFFSET的缺陷。

分场景实现

场景1:你的UUID是时间有序的(比如UUIDv1)

UUIDv1的字符串本身包含时间戳,字符串比较的顺序和生成时间一致,直接用主键就能做游标过滤:

-- 获取ID为'abcd'之后的3条记录(按ID升序,也就是插入顺序)
SELECT id, content, created_at
FROM items
WHERE id > 'abcd'
ORDER BY id ASC
LIMIT 3;

场景2:用UUIDv4(随机UUID),必须配合时间字段排序

UUIDv4是完全随机的,字符串顺序和插入时间无关,这时候一定要加created_at这类时间字段来保证排序稳定,同时结合主键避免同时间插入的记录排序混乱:

  1. 先拿到游标记录的时间戳:
SELECT created_at FROM items WHERE id = 'abcd';
  1. 用「时间戳+主键」组合过滤后续数据:
-- 假设游标记录的created_at是'2024-05-20 10:00:00'
-- 按created_at升序获取后续3条(更新的记录)
SELECT id, content, created_at
FROM items
WHERE (created_at > '2024-05-20 10:00:00')
   OR (created_at = '2024-05-20 10:00:00' AND id > 'abcd')
ORDER BY created_at ASC, id ASC
LIMIT 3;

如果是按created_at降序(最新记录在顶部),要获取游标记录之前的3条(更早的记录),只需要把比较符反过来:

SELECT id, content, created_at
FROM items
WHERE (created_at < '2024-05-20 10:00:00')
   OR (created_at = '2024-05-20 10:00:00' AND id < 'abcd')
ORDER BY created_at DESC, id DESC
LIMIT 3;

关键注意事项

  • 必须用唯一的排序组合:比如(created_at, id),因为created_at可能重复,但主键id绝对唯一,这样能保证排序完全稳定,不会漏数据或重复。
  • 前端要保存游标值:每一页的最后一条记录要把created_at和id传给后端,下次请求就用这两个值做过滤,而不是传页码和偏移量。
  • 别依赖UUIDv4的顺序:随机UUID的字符串排序毫无意义,一定要搭配时间字段!

这种方案的最大好处就是——无论中间有多少新数据插入,分页结果都不会混乱,完全解决了OFFSET的「漂移」问题。

内容的提问来源于stack exchange,提问作者Ashley Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:26:28