MySQL-清空表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL-清空表相关的知识,希望对你有一定的参考价值。

参考技术A 1.快速清空表中的数据(20.05.25)

区别:
a.不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容。
b.效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。
c.delete的效果有点像将mysql表中所有记录一条一条删除到删完,而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表。

MySQL8 大表清空和删除正确方法

1 清空大表

1.1 清空方式之truncate

删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似;但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少。

truncate 清空表数据,2.7G的表大概需要10秒以上;

truncate table ucas_file_info;

1.2 清空方式之rename

1.2.1 格式:

mysql> rename table 原表名 to 新表名;

当你执行 RENAME 时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限。

1.2.2 实例

# 新建一个空表(测试);
mysql> create table old_table(id int);

# new_table克隆old_table的表结构;
mysql> create table new_table like old_table;

# old_table改名为backup_table,new_table改名为old_table;
mysql> RENAME TABLE old_table TO backup_table, new_table TO old_table;

# 删除旧表及数据;
mysql> DROP TABLE old_table;	

2 删除

2.1 背景

在生产环境有可能有删除某个不重要大表的需求,因为大表占用的大量磁盘空间,如果我们直接drop掉此表,通常需要20秒以上的时间,总会觉得会卡主MySQL,现在给大家一个正确的删除方法。

2.2 首先我们查看此大表

# linux 之shell窗口指令
[root@ras221 db]# du -shc old_table*
12K	old_table.frm
49G	old_table.ibd
[root@ras221 db]# ls -l old_table*
-rw-r----- 1 mysql mysql      9075 11月  8 11:39 old_table.frm
-rw-r----- 1 mysql mysql 52273610752 1月  10 14:12 old_table.ibd
[root@ras221 db]# ln old_table.ibd old_table.ibd.bak		# 硬链接;
[root@ras221 db]# ls -l old_table*
-rw-r----- 1 mysql mysql      9075 11月  8 11:39 old_table.frm
-rw-r----- 1 mysql mysql 52273610752 1月  10 14:12 old_table.ibd
-rw-r----- 1 mysql mysql 52273610752 1月  10 14:12 old_table.ibd.bak
[root@ras221 db]# 

# mysql 
mysql> drop table old_table;
Query Ok, 0 rows affacted(0.92 sec)

通过这样的操作,可以减少mysql drop大表hang住的时间,然后在业务低峰期再去删除真实的那个*.b文*.bak件。

2.3 删除原理

        就是利用OS HARD LINK的原理,当多个文件名同时指向同一个INODE时,这个INODE的引用数N>1, 删除其中任何一个文件名都会很快.因为其直接的物理文件块没有被删除.只是删除了一个指针而已;
        当INODE的引用数N=1时, 删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时;

对于MySQL大表删除技巧:

技巧一:

先用rename table替代drop table
mysql> rename table old_table to old_table_bak;

技巧二:

考虑使用XFS文件系统,直接移除对于表存储的数据文件,对于Drop表动作要快。

以上是关于MySQL-清空表的主要内容,如果未能解决你的问题,请参考以下文章

mysql 怎样清空一个数据库中的所有表

怎么循环创建mysql表分区和清空表分区

MYSQL 清空表和截断表

如何在mysql中清空某个数据库文件?

MySQL大表清空和删除正确方法

HBase创建,删除,清空数据表