mysql 的分页怎么保证不丢数据和不出现重复数据?

319 天前
 ben548
有一个活动列表,需要按开始时间排序,想通过上一页的最后一条数据的开始时间(last_start_time)来做下一页的查询依据,即下一页的 start_time < last_start_time ,但是这样会导致 start_time 等于 last_start_time 的数据展示不出来,怎么处理比较好呢?
2132 次点击
所在节点    MySQL
12 条回复
hhjswf
319 天前
主键是自增的话,用主键排序。
话说用 limit 分页不就好了吗。。还要手动做分页
brader
319 天前
如果你时间粒度不够的话,比如你是存的秒级,然后同秒非常多数据,那你就应该要设定第二个排序字段啊,比如用 ID
opengps
319 天前
时间精确到毫米级,yyyy/MM/dd HH:mm:ss.fffffff 至少可以做到把毫秒级不冲突的场景满足需要
gogogo1203
319 天前
可以用 OFFSET ,反正一个页面显示的数量是固定的。
Still4
319 天前
加入纳秒以及随机数,确保排序值不重复
sunhuawei
319 天前
... WHERE start_time < last_start_time AND id < last_id ORDER BY start_time, id DESC
xuanbg
319 天前
倒序分页直接 limit p, s 肯定会因为删除导致丢,新增导致重复啊。丢似乎没什么好办法,重复是可以通过 last id 解决的,还能顺带着解决 limit 效率低下的问题。
xiangyuecn
319 天前
@hhjswf #1 @gogogo1203 #4 问题有这么简单就好了

如果先前排序后的顺序 和 新数据插入(或更新)后的顺序不一致,这个分页没法保证不丢数据的前提下不出现重复数据

并且问题现象是随机的 除非并发进行读写测试 不然你测都测不出来
makelove
319 天前
用 <= 不就行了,如果有和之前尾部数据重复的去掉
chunworkhard
319 天前
排序中加入第二个可以区别的字段, 比如 id
ben548
319 天前
@sunhuawei 我也想到的是这个,WHERE start_time <= last_start_time AND id < last_id ORDER BY start_time, id DESC ,这个语句应该是能解决我的问题了
a7851578
318 天前
按时间切分用分区表

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/951394

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX