同一个列表接口,两次请求拿到的 10 条有三个不一样。SQL 是 order by update_time desc limit 10,update_time 有几万条重复。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,排序键有大量重复值时,数据库对并列行的先后不做保证,两次执行可能给出不同顺序。加上 limit 只取前 N 条,边界上的行就随机进出结果集。

「limit 排序不稳定」这类改动最怕改一半,回滚脚本先准备好,再动生产。改完顺手把文档补一句,省得下次自己重新推一遍。

SELECT id, title FROM articles
ORDER BY update_time DESC, id DESC
LIMIT 10;

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

具体做法是,排序键后面补上主键 保证排序唯一;索引也按这两列建 避免额外排序;把接口的排序字段固定下来 不要让前端随意传;用同一份数据连续请求十次做对比。

最后用这个标准收尾,连续十次请求返回的 id 序列完全一致 翻页也不再出现重复和漏项。

作者 9823189