SELECT id, create_time FROM t_order
WHERE (create_time, id) < ('2026-11-14 10:00:00', 90211)
ORDER BY create_time DESC, id DESC LIMIT 20;

订单列表按 create_time 倒序翻页,每页 20 条,第一页最后三条在第二页又出现一次,前端去重后整页只剩 17 条。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,每个片各自排序取前 20 条,中间件再归并截取,时间相同的记录在各片之间没有稳定顺序。翻到第二页时截取窗口整体后移,相同时间戳的行就重复了。

「跨分片分页排序」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:排序键补上唯一列 用 create_time 加 order_id 组成稳定序;每片取 offset 加 limit 条 归并后再截取 不要每片只取 limit;把 offset 翻页换成游标 传上一页最后一条的时间加 id;固定时间范围连续翻页验证没有重复。

改完只确认一件事:连续翻五页 每页 20 条 主键既没有重复也没有漏。

作者 9823189