MySQL 可以压缩或回收磁盘空间吗

时间:2023-01-11 10:11:00

MYSQL 的数据库中的表,在使用中因为插入,删除或者UPDATE 等会产生页面的碎片,而碎片多了就会产生页面中不可用的数据空白,空白多了就会导致实际上存储的数据和在文件上生成的数据文件之间的差异,导致磁盘空间浪费的问题。

MYSQL 的数据库中表支持单表单文件的特性,而我们的optimize table 主要的面对表在大量UPDATE 或者删除数据后的优化工作。

首先我们可以确认optimize table 对于数据库是有必要操作的,尤其针对业务中对表操作中充斥了大量的insert ,update,delete 等操作,使用这个命令可以让数据库重新的组织数据和重组,并且已经可以被释放的磁盘空间可以在释放给操作系统。

在很多情况下,数据表本身可能根本不大,但是在占用操作系统层面上,占用的数据量很大。

MySQL 可以压缩或回收磁盘空间吗

MySQL 可以压缩或回收磁盘空间吗

在这样的情况下,我们就需要针对这样的表进行清理的工作了,optimize table 主要面对在数据表中存在的varchar ,varbinary,blob, text 等大量应用在表中,并且被清理后的情况也适合使用 optimize table.

为什么要进行表的收缩的工作,主要的原因如下

1 表占用的数据空间,比实际的数据应该占用的表空间要大

2 表在全表扫描的过程中,比碎片少的数据表,扫描的时间明显长,尤其在进行如 count 操作等

3 影响数据插入的性能,因为数据在碎片中插入数据的性能明显比在没有碎片的页面中插入数据的速度要快。

针对INNODB 的表,我们在操作中会直接得到如下的信息

MySQL 可以压缩或回收磁盘空间吗

这是因为 optimize table 在INNODB表中的操作转变为

alter table table_name engine = 'innodb';

analyze table table_name;

或者

alter table table_name force;

analyze table table_name;

这个操作中会锁表,产生一个新的表,并将数据复制到新表中,在将老表清理掉,新表改为原来的表名。

要进行这个操作,需要如下的一些工作

在数据库安装之初,咱们的 innodb_file_per_table = 1

MySQL 可以压缩或回收磁盘空间吗

同时需要对表的data_free 进行,检查,如果 data free 比较大的情况下对比实际的表,就说明表中的碎片是比较大,需要进行数据的整理。

MySQL 可以压缩或回收磁盘空间吗

另一种对表得数据压缩的方式也可以将表进行处理,直接将表的数据格式转变为 compressed ,通过这样的方式对于一些 varchar, text blob 等字段类型较多的表进行空间方面的缩减。但 如果表中的字段都是整形或数值型的状态,那么表基本上就不会被压缩。

MySQL 可以压缩或回收磁盘空间吗