mysql 删除数据后表占用空间还是很大

在公司项目中做5g大表优化处理的过程中。对一个10G左右的大表做分表处理。并在数据分表平衡迁移后,发现原表的占用空间并没有降下来。于是开始百度了一波,发现网上早有不少博客详细说明了。在此做个笔记。

1. mysql在空间方面的特性

mysql 配置有一项是针对其文件存储空间使用的,Innodb_File_Per_Table,如果该参数设置了OFF 那么就是使用文件共享空间,则删除后会保留很多空间,而设置了ON之后,会每个表会使用独立的空间。

2. 问题出现原因

在删除sql语句中,写法如下:

DELETE FROM XXX表 WHERE type=0 LIMIT 300;

所有delete带有where条件的,都不是真删除。只是MySQL给记录加了个删除标识,自然这样操作后表数据占有空间也不会变小了。

3. 解决方案

3.1 MyISAM、BDB

DELETE FROM XXX表 WHERE type=0 LIMIT 300;
OPTIMIZE TABLE XXX表;

3.2 innodb

ALTER TABLE tableName ENGINE=InnoDB(前提是innodb_file_per_table = ON)

该方法会对旧表以复制的方式新建一个新表,然后删除旧表。虽然这个过程是安全的,但是在进行操作时还是先进行备份为好。 然后对表的索引信息做重新统计

analyze table tableName

如果一定收缩整理碎片,要需要说明的是,避免一次性删除大量数据,容易造成mysql过载而崩溃。

4.关于碎片

关于碎片处理的问题,大家可以参考如下的博客,里面讲得很详细 https://www.jb51.net/article/225434.htm

经验分享 程序员 微信小程序 职场和发展