在清理整个大表时,我们推荐使用drop,而非delete。但是如果表实在太大,即使是drop,也需要消耗一定的时间。这时可以利用linux的硬连接来快速删除大表,操作过程如下:
有一个大表test,共有4194304行数据,表空间文件大小为1.3G
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 4194304 |
+----------+
1 row in set (15.20 sec)
有一个大表test,共有4194304行数据,表空间文件大小为1.3G
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 4194304 |
+----------+
1 row in set (15.20 sec)
mysql> show create table testG
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.12 sec)
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.12 sec)
[root@master sam]# du -sh test.ibd
1.3G test.ibd
12345678910111213141516171819
1.首先创建硬链接
ln test.idb test.idb.hl
ln test.frm test.frm.hl
12
2.删除test表
drop table test;
1
3.会发现,drop操作速度很快,原来的test.idb和test.frm不见了,但是硬链接文件还在,所以真正的释放磁盘空间,需要删除test.idb.hl和test.frm.hl。
快速删除原理:
首先硬链接创建的文件test.idb.hl,和源文件test.idb是指向同一个inode。而MySQL的drop操作,实际上是删除test表对应的.idb和.frm文件,也就是test.idb和test.frm。而linux在有硬连接的情况下,删除其中源文件会非常快,因为只是删除了inode的指针,实际的数据还存储在inode里。所以磁盘空间并没有真正释放,需要将硬连接文件也删除,才是真正的释放磁盘空间。
1.3G test.ibd
12345678910111213141516171819
1.首先创建硬链接
ln test.idb test.idb.hl
ln test.frm test.frm.hl
12
2.删除test表
drop table test;
1
3.会发现,drop操作速度很快,原来的test.idb和test.frm不见了,但是硬链接文件还在,所以真正的释放磁盘空间,需要删除test.idb.hl和test.frm.hl。
快速删除原理:
首先硬链接创建的文件test.idb.hl,和源文件test.idb是指向同一个inode。而MySQL的drop操作,实际上是删除test表对应的.idb和.frm文件,也就是test.idb和test.frm。而linux在有硬连接的情况下,删除其中源文件会非常快,因为只是删除了inode的指针,实际的数据还存储在inode里。所以磁盘空间并没有真正释放,需要将硬连接文件也删除,才是真正的释放磁盘空间。
原文链接:https://blog.csdn.net/weixin_39004901/article/details/89842162