是这样的,有张表 tableA,里面有 220 万条数据。 现在需要删除其中 130 多万条数据,而且这些数据还会有关联的业务表,通过 tableA 中的业务编号关联。 怎么才能快速清楚这些数据?直接 delete 的话应该会很慢的。 我看了执行计划,type=ALL,filter=100.00,extra=Using where
1 ZZ74 2024-10-12 15:32:05 +08:00 找个夜深人静执行 delete 或者写个程序慢慢删。 就为了一个删除搞两张表数据同步双写之类的也耗时间,麻烦 |
2 gitnot 2024-10-12 15:38:18 +08:00 insert select 后 改表名, 这么点洒洒水 |
@luxinfl 推数据有什么不保险的,先确定一批数据比如 130W 条的主键及其关联的其他业务表的数据主键。然后低谷时定时执行,N 条一批 删除。 |
6 securityCoding 2024-10-12 17:05:06 +08:00 ![]() 没懂,这点数据你敲完键盘下一秒就删完了 |
![]() | 7 tomatocici2333 2024-10-12 17:07:06 +08:00 你这是要先理清除这些字段的血缘关系吧。要删得话,其他表和这个相关得数据也需要一起删? |
![]() | 8 adoal 2024-10-12 17:15:44 +08:00 你这 130 万条数据之间有相互关系不,是否一定要整体做原子删除,如果不是的话,分批慢慢删也没关系啊。 |
9 paomianshi 2024-10-12 18:09:01 +08:00 这种情况我一般是写个脚本自动分批跑 |
![]() | 10 ghost024 2024-10-12 18:29:13 +08:00 搞个跑批,要删的业务表应该都有删除的方法,根据表 a 的业务编号直接同步删除,然后这个操作分批进行(这种方式必须保证这些关联数据是完全独立的,要是两个记录共用一个数据就别删了),或者就是先在表 a 加个标志,逻辑删好了,也快的 |
![]() | 11 nerkeler 2024-10-12 22:06:14 +08:00 其他的查出来放一张新表,旧表 truncate 命令删掉 |
![]() | 12 COW 2024-10-12 22:32:37 +08:00 搞个逻辑删除,is_deleted 置为 true 。 |
![]() | 13 akira 2024-10-13 01:39:24 +08:00 删除数据的时候 ,数据安全才是最重要的。。 速度其实并不重要。。 |
![]() | 14 Tubbs 2024-10-13 10:06:56 +08:00 via iPhone 我们在生产中一般用 gh-ost 这种工具进行 ddl ,解决你说的数据在不断写入的问题,无锁无延迟的 ddl 速度会快很多 |
![]() | 15 Tubbs 2024-10-13 10:11:59 +08:00 via iPhone 对于删除数据这种 dml 场景实际上也能用 gh-ost 通过 gh-ost 复制表的结构到一个新的影子表,然后在这张表里应用删除逻辑,这样可以避免在原表上直接操作导致性能问题,操作的时候同时进行增量同步,最后切到新表就行 |
![]() | 16 siweipancc 2024-10-13 15:19:47 +08:00 via iPhone 这时候 orm 就有用了,哈哈哈。 没办法,梳理业务吧,不要删除,移动数据。 |
![]() | 17 8355 2024-10-14 10:02:26 +08:00 首先是这样啊,你应该没删过大量数据吧 删除数据本身并不会释放磁盘空间,只是把这条数据在原始文件中增加标记,如果是需要释放空间关键在磁盘碎片的清理方案而不是删除本身 上面有老哥说的没问题,130 万正常的生产数据库就是 1 秒就结束了。。 |