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

5f8bc8a04e2c20950ebdae9a0da60daf.png

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

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

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

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

4e50157f9962889a7ca6e17535b23ac4.png

5fb3e5ba56f1fa6c9d628497fe04ea93.png

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

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

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

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

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

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

abe59a21d86d50f34b6a10f42e5a2772.png

这是因为 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 

ee3249afcf32d6e2d647082a4fb7309f.png

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

ac4b15184b72e46017072cc32bc1c296.png

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

d8a3035e9183cdf9d2e2fe90835f7eb5.png

d42fca4ba7635f47b4ecb76ec782120f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值