MySQL delete删除数据后,释放磁盘空间

当 MySQL 数据库服务删除部分数据后;有些情况下这些数据占用的存储空间会释放掉,有些情况这些存储空间则不会释放。以下是对这种情况的简单说明:

一、删除表|清空数据表

当执行删除数据表或者清空数据表的全部数据操作时,都会释放掉相应的磁盘存储空间

drop table table_name;
truncate table table_name;

在MyISAM和InnoDB(innodb_file_per_table)存储引擎中,数据信息存在在单个文件中。删除表操作和清空数据表操作都会释放空间。

二、删除表数据

delete from table_name [where xxx];

使用delete删除的时候,MySQL并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,MySQL会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。

三、优化表空间

方法一:

optimize table table_name ;

当表数据被大量删除后,释放占用的空间就变得很有必要了。会明显的提高查询速度。使用 optimize table。被删除的记录被保持在链接清单中,后续的 insert 操作会重新使用旧的记录位置。您可以使用 optimize table 来重新利用未使用的空间,并整理数据文件的碎片。optimize 适用于InnoDB和MyISAM存储引擎。

查看表占用硬盘空间大小的SQL语句如下:(默认用M做展示单位)

SELECT TABLE_NAME, (DATA_LENGTH+INDEX_LENGTH)/1048576 as size_Mb, TABLE_ROWS FROM information_schema.tables WHERE TABLE_SCHEMA='wow_tencent_1' AND TABLE_NAME='user'

方法二:

alter table tab_name  ENGINE = 'InnoDB';

注意:该操作执行的时候会把该表格先写入一个tmp临时表,所以磁盘剩余空间必须大于表空间,否则会执行失败。
方法三:
先将整个表的结构和数据导出来,删除整个表,再创建表,最后导入数据。生产环境不建议用这个方法

总结
通过从InnoDB存储空间分布,delete对性能的影响可以看到,delete物理删除既不能释放磁盘空间,而且会产生大量的碎片,导致索引频繁分裂,影响SQL执行计划的稳定性;

同时在碎片回收时,会耗用大量的CPU,磁盘空间,影响表上正常的DML操作。

在业务代码层面,应该做逻辑标记删除,避免物理删除;为了实现数据归档需求,可以用采用MySQL分区表特性来实现,都是DDL操作,没有碎片产生。

另外一个比较好的方案采用Clickhouse,对有生命周期的数据表可以使用Clickhouse存储,利用其TTL特性实现无效数据自动清理。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL或MariaDB中,当执行DELETE语句删除数据时,磁盘空间通常不会立即释放。这是因为MySQL使用了一种称为“Undo Log”的机制来实现事务的回滚和MVCC(多版本并发控制)功能。 当执行DELETE语句时,MySQL会将被删除数据记录存储在Undo Log中,以便在需要回滚事务或提供MVCC功能时使用。这样做的好处是可以保证数据的一致性和并发性。 然而,这也导致了磁盘空间没有立即释放的情况。要释放磁盘空间,可以通过以下几种方式: 1. 执行OPTIMIZE TABLE命令:这个命令会重新组织表的物理存储,包括回收已删除空间。但是需要注意的是,OPTIMIZE TABLE命令可能会导致表被锁定,并且在大表上执行时可能需要较长时间。 2. 使用TRUNCATE TABLE命令:TRUNCATE TABLE命令会删除表中的所有数据,并释放磁盘空间。但是需要注意的是,TRUNCATE TABLE命令是DDL语句,会自动提交事务并且无法回滚。 3. 使用ALTER TABLE命令:通过ALTER TABLE命令重建表,可以释放磁盘空间。例如,可以创建一个新表并将数据插入其中,然后删除原表。但是需要注意的是,这种方法可能会导致表结构和索引的重新构建,可能会影响性能。 4. 等待自动回收:MySQL会在后台自动回收已删除数据磁盘空间,这个过程称为垃圾回收。可以通过设置innodb_undo_log_truncate选项来控制垃圾回收的频率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值