SELECT id, title FROM products
ORDER BY id DESC LIMIT 20 OFFSET 380;

商品列表按更新时间倒序,翻到第 20 页开始出现前一天已经看过的条目,再往后两页又少了几条。每页 20 条,total 一直是 1200。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,offset 是按当前结果集的位置跳过 N 条,翻页期间有新数据插到前面,整个结果集往后挪,上一页末尾那几条就被挤到下一页。删数据则相反,后面的记录整体前移,中间几条直接被跳过。

「offset 分页」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。

处理上按这个顺序:列表按固定且唯一的字段排序 别用更新时间这种会变的列;翻页期间前端把已展示的 id 带去重 兜住重复项;数据量大的列表改成游标分页 用最后一条的排序值做下一页起点;压测时一边翻页一边写入 观察是否出现重复 id。

改完只确认一件事:一边翻页一边插入新商品 已展示的 id 不再重复出现 也不会整页跳过。

作者 9823189