利用创建硬链接的方式删除表
查看表大小 mysql> select a.FILE_NAME,a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 from information_schema.FILES a where a.FILE_ID=291; +-------------+----------------------------------------------+ | FILE_NAME | a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 | +-------------+----------------------------------------------+ | ./ht/tb.ibd | 16.500000000000 | +-------------+----------------------------------------------+ 1 row in set (0.00 sec) mysql> select count(1) from ht.tb; +-----------+ | count(1) | +-----------+ | 268435456 | +-----------+ 1 row in set (3 min 11.39 sec) 添加列,验证是否重新创建表 mysql> alter table ht.tb add column city varchar(20) default 'beijing'; Query OK, 0 rows affected (17 min 8.64 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select a.FILE_NAME,a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 from information_schema.FILES a where a.FILE_ID=293; +-------------+----------------------------------------------+ | FILE_NAME | a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 | +-------------+----------------------------------------------+ | ./ht/tb.ibd | 13.742187500000 | +-------------+----------------------------------------------+ 1 row in set (0.00 sec) 表的大小和文件号都改变,确认alter table 会创建表,在创建表的过程当中会锁表。 创建硬链接 [root@redis01 ht]# ln tb.ibd tb.h [root@redis01 ht]# ll total 28819828 -rw-r-----. 1 mysql mysql 61 Jun 13 09:33 db.opt -rw-r-----. 1 mysql mysql 8586 Jun 28 11:16 person.frm -rw-r-----. 1 mysql mysql 98304 Jun 28 11:18 person.ibd -rw-r-----. 1 mysql mysql 8703 Jun 28 11:16 shirt.frm -rw-r-----. 1 mysql mysql 98304 Jun 28 11:18 shirt.ibd -rw-r-----. 1 mysql mysql 8616 Aug 22 12:06 tb.frm -rw-r-----. 1 mysql mysql 8616 Aug 22 12:06 tb.frm_bak -rw-r-----. 2 mysql mysql 14755561472 Aug 21 18:00 tb.h -rw-r-----. 2 mysql mysql 14755561472 Aug 21 18:00 tb.ibd -rw-r-----. 1 mysql mysql 8652 Aug 22 11:33 tb_new.frm -rw-r-----. 1 root root 8652 Aug 22 11:41 tb_new.frm_bak -rw-r-----. 1 mysql mysql 98304 Aug 22 11:33 tb_new.ibd 删除表 mysql> drop table ht.tb; Query OK, 0 rows affected (1.54 sec) 从时间上看很快就删除,在删除硬链接 [root@redis01 ht]# ll total 28762380 -rw-r-----. 1 mysql mysql 61 Jun 13 09:33 db.opt -rw-r-----. 1 mysql mysql 8586 Jun 28 11:16 person.frm -rw-r-----. 1 mysql mysql 98304 Jun 28 11:18 person.ibd -rw-r-----. 1 mysql mysql 8703 Jun 28 11:16 shirt.frm -rw-r-----. 1 mysql mysql 98304 Jun 28 11:18 shirt.ibd -rw-r-----. 1 mysql mysql 8616 Aug 22 12:06 tb.frm_bak -rw-r-----. 1 mysql mysql 14755561472 Aug 22 15:46 tb.h -rw-r-----. 1 mysql mysql 8652 Aug 22 11:33 tb_new.frm -rw-r-----. 1 root root 8652 Aug 22 11:41 tb_new.frm_bak -rw-r-----. 1 mysql mysql 14696841216 Aug 22 15:33 tb_new.ibd [root@redis01 ht]# rm -f tb.h 利用truncate删除大表 mysql> select a.FILE_ID,a.FILE_NAME,a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 from information_schema.FILES a where a.FILE_ID=295; +---------+-----------------+----------------------------------------------+ | FILE_ID | FILE_NAME | a.TOTAL_EXTENTS*a.EXTENT_SIZE/1024/1024/1024 | +---------+-----------------+----------------------------------------------+ | 295 | ./ht/tb_new.ibd | 13.687500000000 | +---------+-----------------+----------------------------------------------+ 1 row in set (0.00 sec) mysql> truncate table ht.tb_new; Query OK, 0 rows affected (8.53 sec) mysql> drop table ht.tb_new; Query OK, 0 rows affected (0.03 sec) 从上面可以得出结论,对于大表利用truncate也能很快删除。