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

本文探讨了在项目中对10G大表做分表处理时,空间未减小的困惑。发现MySQL空间特性与删除操作的误区,并提供了针对InnoDB和MyISAM/BDB的不同解决方案,包括OPTIMIZE TABLE和ALTER TABLE引擎切换。同时,涉及了碎片处理和注意事项,推荐参考链接深入理解。
摘要由CSDN通过智能技术生成

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值