› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
ben548
V2EX  ›  MySQL

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

  •  
  •   ben548 · Jun 25, 2023 · 3578 views
    This topic created in 1191 days ago, the information mentioned may be changed or developed.
    有一个活动列表,需要按开始时间排序,想通过上一页的最后一条数据的开始时间(last_start_time)来做下一页的查询依据,即下一页的 start_time < last_start_time ,但是这样会导致 start_time 等于 last_start_time 的数据展示不出来,怎么处理比较好呢?
    12 replies  •  2023-06-25 16:01:43 +08:00
    hhjswf
        1
    hhjswf  
       Jun 25, 2023 via Android
    主键是自增的话,用主键排序。
    话说用 limit 分页不就好了吗。。还要手动做分页
    brader
        2
    brader  
       Jun 25, 2023   ❤️ 1
    如果你时间粒度不够的话,比如你是存的秒级,然后同秒非常多数据,那你就应该要设定第二个排序字段啊,比如用 ID
    opengps
        3
    opengps  
       Jun 25, 2023
    时间精确到毫米级,yyyy/MM/dd HH:mm:ss.fffffff 至少可以做到把毫秒级不冲突的场景满足需要
    gogogo1203
        4
    gogogo1203  
       Jun 25, 2023
    可以用 OFFSET ,反正一个页面显示的数量是固定的。
    Still4
        5
    Still4  
       Jun 25, 2023
    加入纳秒以及随机数,确保排序值不重复
    rebang
        6
    rebang  
       Jun 25, 2023
    ... WHERE start_time < last_start_time AND id < last_id ORDER BY start_time, id DESC
    xuanbg
        7
    xuanbg  
       Jun 25, 2023
    倒序分页直接 limit p, s 肯定会因为删除导致丢,新增导致重复啊。丢似乎没什么好办法,重复是可以通过 last id 解决的,还能顺带着解决 limit 效率低下的问题。
    xiangyuecn
        8
    xiangyuecn  
       Jun 25, 2023
    @hhjswf #1 @gogogo1203 #4 问题有这么简单就好了

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

    并且问题现象是随机的 除非并发进行读写测试 不然你测都测不出来
    makelove
        9
    makelove  
       Jun 25, 2023
    用 <= 不就行了,如果有和之前尾部数据重复的去掉
    chunworkhard
        10
    chunworkhard  
       Jun 25, 2023
    排序中加入第二个可以区别的字段, 比如 id
    ben548
        11
    ben548  
    OP
       Jun 25, 2023
    @sunhuawei 我也想到的是这个,WHERE start_time <= last_start_time AND id < last_id ORDER BY start_time, id DESC ,这个语句应该是能解决我的问题了
    a7851578
        12
    a7851578  
       Jun 25, 2023
    按时间切分用分区表
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1091 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 23:15 · PVG 07:15 · LAX 16:15 · JFK 19:15
    ♥ Do have faith in what you're doing.