前言
删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候。这样一条命令下去,MySQL可能就直接夯住了,外在表现就是QPS急速下降,客户请求变慢。
解决办法
1.业务低峰时间手动执行删除
这个可能就需要DBA不辞辛劳,大晚上爬起来删表了。
2.先清除数据,最后再删除的方式
譬如1000万条数据,写脚本每次删除20万,睡眠一段时间,继续执行。这样也能做到对用户无感知。
3.对表文件(idb文件)做一个硬链接来加速删除
这个方法利用了linux下硬链接的知识,来进行快速删除,不记得话可以回去翻一下《鸟哥的linux私房菜》
ln data_center_update_log.ibd data_center_update_log.ibd.hdlk
[root@mysql01 sports_center]# ll
总用量 19903792
-rw-r----- 1 mysql mysql 9076 10月 17 13:15 data_center_update_log.frm
-rw-r----- 2 mysql mysql 8447328256 12月 23 11:35 data_center_update_log.ibd
-rw-r----- 2 mysql mysql 8447328256 12月 23 11:35 data_center_update_log.ibd.hdlk
- 执行上面命令后,我们就多了一个data_center_update_log.ibd.hdlk文件。此操作实际上不会占用磁盘空间,只是增加了一次对磁盘上文件的引用。
- 当我们删除其中任何一个文件时,都不会影响磁盘上真实的文件,只是将其引用数目减去1。

本文探讨了在MySQL中删除大表时如何避免对数据库性能造成严重影响,包括在业务低峰时间手动删除、分批清除数据、利用硬链接加速删除、使用DROP TABLE操作以及详细介绍了如何通过`truncate_bigfile.sh`脚本分块删除硬链接文件,以降低IO开销和CPU负载。
最低0.47元/天 解锁文章
2037





