背景
生产环境有一张日志表 schedule_task_error_log ,数据量超过 5000w,想通过 drop 删除但是速度很慢。
1 | -rw-rw----. 1 mysql mysql 5.1K Jan 8 2018 schedule_task_error_log.frm |

原理
前提:MySQL 开启了独立表空间,MySQL 5.6.7 之后默认开启。
1 | MariaDB> show variables like 'innodb_file_per_table'; |
MySQL 在删除大表的时候为什么慢?
Buffer Pool页面清除过程(拥有InnoDB全局锁)- 删除
ibd磁盘文件过程
方案:利用了 Linux 中 硬链接 减少 DDL 时间,加快锁释放,来进行快速删除。
实践
1. 建立硬连接
1 | $ ln schedule_task_error_log.ibd schedule_task_error_log.ibd.hdlk |
2. drop table
再看物理文件的引用数变为 1,然后我们可以另外找时间手动删除物理文件。
1 | MariaDB> drop table schedule_task_error_log; |
3. 删除物理文件
1 | $ rm -rf schedule_task_error_log.ibd.hdlk |