V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Red998
V2EX  ›  程序员

Mysql 批量删除数据有啥好的方案?

  •  
  •   Red998 · 2022-06-22 17:10:18 +08:00 · 1602 次点击
    这是一个创建于 646 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.写代码删、需要一批批的删除。要考虑事务长、超时问题。 2.写脚本删、怕锁表。造成阻塞 大佬们、你们删除批量数据怎么删除?

    11 条回复    2022-06-23 11:52:13 +08:00
    seanzxx
        1
    seanzxx  
       2022-06-22 17:17:04 +08:00 via iPhone
    数量少的话 delete limit 呀,在负载低的时候删,数量多就建分区呀,改动大一点
    aitaii
        2
    aitaii  
       2022-06-22 17:23:07 +08:00
    如果业务能中断 1 秒的话,创建一个表 A_1,rename 表,A->A_COPY, A_1->A A_COPY 删完数据拷贝到 A 表
    ch2
        3
    ch2  
       2022-06-22 17:26:59 +08:00   ❤️ 2
    update set is_deleted=true
    binge921
        4
    binge921  
       2022-06-22 17:32:53 +08:00
    drop taba
    toyassb
        5
    toyassb  
       2022-06-22 17:41:12 +08:00 via iPhone
    rm datadir
    wtfedc
        6
    wtfedc  
       2022-06-22 17:43:35 +08:00
    删除数据的时候,只是把数据标记成了 delete ,并没有节省物理空间。可以插入一条的时候,删多条
    lexin132
        7
    lexin132  
       2022-06-22 17:46:16 +08:00
    把要删除的数据 id 保存到 redis 或者文件里,然后另外起个脚本读取 id 再按需删除?
    删除数据的场景下应该不会特别大量吧。。
    sunhuawei
        8
    sunhuawei  
       2022-06-22 18:16:46 +08:00
    根据主键删;脚本设置好间隔时间能避免阻塞;如果是大量 sql 可以手动开启事务,手动提交,避免自动开启事务消耗大量时间;删除后记得重建索引
    cheng6563
        9
    cheng6563  
       2022-06-22 18:39:15 +08:00
    while(true){
    int updateRows = executeUpdate("delete ... limit 100");
    if(updateRows == 0 ) break;
    Thread.sleep(200);
    }
    wineast
        10
    wineast  
       2022-06-23 10:30:35 +08:00
    先把要删除的数据 select 出来,然后按照 where id=xxx and 过滤条件 双重保证来删除把,这样的脚本也符合安全审计的要求
    ramdava
        11
    ramdava  
       2022-06-23 11:52:13 +08:00
    #3 楼正解
    话说,有什么业务场景需要批量删数据的?
    有什么业务场景是逻辑删除不可以解决的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3254 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:48 · PVG 18:48 · LAX 03:48 · JFK 06:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.