在公司项目中做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