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