V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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
luxinfl
V2EX  ›  MySQL

请教个问题,如何快速的删除 mysql 的数据

  •  
  •   luxinfl · 70 天前 · 2276 次点击
    这是一个创建于 70 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样的,有张表 tableA,里面有 220 万条数据。 现在需要删除其中 130 多万条数据,而且这些数据还会有关联的业务表,通过 tableA 中的业务编号关联。 怎么才能快速清楚这些数据?直接 delete 的话应该会很慢的。 我看了执行计划,type=ALL,filter=100.00,extra=Using where

    19 条回复    2024-10-14 11:33:26 +08:00
    ZZ74
        1
    ZZ74  
       70 天前
    找个夜深人静执行 delete 或者写个程序慢慢删。
    就为了一个删除搞两张表数据同步双写之类的也耗时间,麻烦
    gitnot
        2
    gitnot  
       70 天前
    insert select 后 改表名, 这么点洒洒水
    luxinfl
        3
    luxinfl  
    OP
       70 天前
    @ZZ74 有人时时刻刻再推数据,感觉不是太保险。。
    luxinfl
        4
    luxinfl  
    OP
       70 天前
    @gitnot 把需要的数据弄到一张新表是吧?但是关联表有七八张表,这也太费劲了。。
    ZZ74
        5
    ZZ74  
       70 天前
    @luxinfl 推数据有什么不保险的,先确定一批数据比如 130W 条的主键及其关联的其他业务表的数据主键。然后低谷时定时执行,N 条一批 删除。
    securityCoding
        6
    securityCoding  
       70 天前   ❤️ 1
    没懂,这点数据你敲完键盘下一秒就删完了
    tomatocici2333
        7
    tomatocici2333  
       70 天前
    你这是要先理清除这些字段的血缘关系吧。要删得话,其他表和这个相关得数据也需要一起删?
    adoal
        8
    adoal  
       70 天前
    你这 130 万条数据之间有相互关系不,是否一定要整体做原子删除,如果不是的话,分批慢慢删也没关系啊。
    paomianshi
        9
    paomianshi  
       70 天前
    这种情况我一般是写个脚本自动分批跑
    ghost024
        10
    ghost024  
       70 天前
    搞个跑批,要删的业务表应该都有删除的方法,根据表 a 的业务编号直接同步删除,然后这个操作分批进行(这种方式必须保证这些关联数据是完全独立的,要是两个记录共用一个数据就别删了),或者就是先在表 a 加个标志,逻辑删好了,也快的
    nerkeler
        11
    nerkeler  
       70 天前
    其他的查出来放一张新表,旧表 truncate 命令删掉
    COW
        12
    COW  
       70 天前
    搞个逻辑删除,is_deleted 置为 true 。
    akira
        13
    akira  
       70 天前
    删除数据的时候 ,数据安全才是最重要的。。 速度其实并不重要。。
    Tubbs
        14
    Tubbs  
       70 天前 via iPhone
    我们在生产中一般用 gh-ost 这种工具进行 ddl ,解决你说的数据在不断写入的问题,无锁无延迟的 ddl 速度会快很多
    Tubbs
        15
    Tubbs  
       70 天前 via iPhone
    对于删除数据这种 dml 场景实际上也能用 gh-ost
    通过 gh-ost 复制表的结构到一个新的影子表,然后在这张表里应用删除逻辑,这样可以避免在原表上直接操作导致性能问题,操作的时候同时进行增量同步,最后切到新表就行
    siweipancc
        16
    siweipancc  
       69 天前 via iPhone
    这时候 orm 就有用了,哈哈哈。
    没办法,梳理业务吧,不要删除,移动数据。
    8355
        17
    8355  
       69 天前
    首先是这样啊,你应该没删过大量数据吧
    删除数据本身并不会释放磁盘空间,只是把这条数据在原始文件中增加标记,如果是需要释放空间关键在磁盘碎片的清理方案而不是删除本身
    上面有老哥说的没问题,130 万正常的生产数据库就是 1 秒就结束了。。
    luxinfl
        18
    luxinfl  
    OP
       68 天前
    @nerkeler 我也想过把需要的数据 insert into select 出来,改个表名,这样应该很快
    luxinfl
        19
    luxinfl  
    OP
       68 天前
    @Tubbs 比较原始,啥也没有。就用 navicate 删。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2508 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 02:57 · PVG 10:57 · LAX 18:57 · JFK 21:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.