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

66 天前
 luxinfl

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

2255 次点击
所在节点    MySQL
19 条回复
ZZ74
66 天前
找个夜深人静执行 delete 或者写个程序慢慢删。
就为了一个删除搞两张表数据同步双写之类的也耗时间,麻烦
gitnot
66 天前
insert select 后 改表名, 这么点洒洒水
luxinfl
66 天前
@ZZ74 有人时时刻刻再推数据,感觉不是太保险。。
luxinfl
66 天前
@gitnot 把需要的数据弄到一张新表是吧?但是关联表有七八张表,这也太费劲了。。
ZZ74
66 天前
@luxinfl 推数据有什么不保险的,先确定一批数据比如 130W 条的主键及其关联的其他业务表的数据主键。然后低谷时定时执行,N 条一批 删除。
securityCoding
66 天前
没懂,这点数据你敲完键盘下一秒就删完了
tomatocici2333
66 天前
你这是要先理清除这些字段的血缘关系吧。要删得话,其他表和这个相关得数据也需要一起删?
adoal
66 天前
你这 130 万条数据之间有相互关系不,是否一定要整体做原子删除,如果不是的话,分批慢慢删也没关系啊。
paomianshi
66 天前
这种情况我一般是写个脚本自动分批跑
ghost024
66 天前
搞个跑批,要删的业务表应该都有删除的方法,根据表 a 的业务编号直接同步删除,然后这个操作分批进行(这种方式必须保证这些关联数据是完全独立的,要是两个记录共用一个数据就别删了),或者就是先在表 a 加个标志,逻辑删好了,也快的
nerkeler
66 天前
其他的查出来放一张新表,旧表 truncate 命令删掉
COW
66 天前
搞个逻辑删除,is_deleted 置为 true 。
akira
66 天前
删除数据的时候 ,数据安全才是最重要的。。 速度其实并不重要。。
Tubbs
66 天前
我们在生产中一般用 gh-ost 这种工具进行 ddl ,解决你说的数据在不断写入的问题,无锁无延迟的 ddl 速度会快很多
Tubbs
66 天前
对于删除数据这种 dml 场景实际上也能用 gh-ost
通过 gh-ost 复制表的结构到一个新的影子表,然后在这张表里应用删除逻辑,这样可以避免在原表上直接操作导致性能问题,操作的时候同时进行增量同步,最后切到新表就行
siweipancc
65 天前
这时候 orm 就有用了,哈哈哈。
没办法,梳理业务吧,不要删除,移动数据。
8355
65 天前
首先是这样啊,你应该没删过大量数据吧
删除数据本身并不会释放磁盘空间,只是把这条数据在原始文件中增加标记,如果是需要释放空间关键在磁盘碎片的清理方案而不是删除本身
上面有老哥说的没问题,130 万正常的生产数据库就是 1 秒就结束了。。
luxinfl
65 天前
@nerkeler 我也想过把需要的数据 insert into select 出来,改个表名,这样应该很快
luxinfl
65 天前
@Tubbs 比较原始,啥也没有。就用 navicate 删。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1079610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX