针对mysql delete删除表数据后占用空间不变小的问题

优化MySQL日志表存储
本文探讨了在MySQL中管理大型日志表的策略,详细介绍了如何通过删除记录和优化表来减少数据占用的空间,避免数据库负载过重,特别关注了在删除数据后空间未释放的问题及解决方案。

开发环境

  • MySQL

前言

物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志表数据就有174G,当前,这么大的数据量,不仅对数据库造成了很大的负载压力,同时查询等维护也缓慢,所以采取将日志记录移出到文件进行存储。但是短期内,还需要数据库中的部分日志记录,故而有了下面的删除记录、优化表操作。

日志表大小一览

表本身有六七百万条数据,从六七百万删到五百多万,发现数据占用空间大小一点也没变,如下图所示。网上查到需要释放删除了的数据占用的空间、也就是优化表或碎片整理,使用到的命令是:OPTIMIZE TABLE tableName

5ad468e710e50.pnguploading.4e448015.gif转存失败重新上传取消

问题出现原因

在删除sql语句中,写法如下:DELETE FROM ueb_logistics_rule_logs WHERE type=0 LIMIT 100; 凡是这样,delete带有where条件的,都不是真删除,只是MySQL给记录加了个删除标识,自然这样操作后表数据占有空间也不会变小了

注意:DELETE FROM ueb_logistics_rule_logs; 这条sql语句执行后,就清空了表数据,占有空间就变为0了

解决方法

主要就是执行下面三条sql语句(轮询删除delete,避免一次性删除数据太多造成MySQL负载崩溃,另外数据量大的时候需要等待网站访问流量小的时候执行)

  • DELETE FROM ueb_logistics_rule_logs WHERE type=0 LIMIT 100;
  • OPTIMIZE TABLE ueb_logistics_rule_logs;
数据库中使用`DELETE`语句删除数据数据并添加条件时,有以下相关情况: ### 语法示例 在 MySQL 中,可使用类似如下语句删除符合条件的数据: ```sql DELETE FROM tablename WHERE condition; ``` 其中,`tablename`是要删除数据数据名称,`condition`是筛选符合删除条件的达式。例如,修改`stu`中周雨彤的成绩,将成绩改为 100 分的语句中,`where`子句用于对记录进行筛选过滤,保留符合条件的记录,将符合条件的记录剔除,这里的`where`子句使用方式与`DELETE`语句中条件的使用逻辑一致[^2]。 ### 性能影响 - **数据量大小**:若数据数据量较小,`DELETE`结合条件删除数据性能影响通常可忽略计,系统能快速筛选并删除符合条件的数据。但当数据量非常大时,系统需逐行扫描数据,判断是否满足条件,这会消耗较多的 CPU 时间和 I/O 资源,性能问题会变得明显。 - **条件复杂度**:如果条件比较简单,例如只涉及单个字段的简单比较(如`DELETE FROM sflight WHERE carrid = 'LH'`),系统可快速进行判断,性能相对较好。但如果条件非常复杂,包含多个逻辑运算符(如`AND`、`OR`)和函数调用,系统需要进行更多的计算和判断,会显著增加处理时间,降低性能。 - **索引使用情况**:若条件涉及的字段上有合适的索引,数据库可利用索引快速定位符合条件的数据,减少扫描的数据量,从而提高删除操作的性能。反之,若没有索引,数据库可能需要全扫描,性能会大幅下降。 - **多关联情况**:在多关联的场景下使用`DELETE`结合条件删除数据,例如`DELETE a FROM tablename AS a LEFT JOIN temp_name AS b ON a.ID = b.ID WHERE b.UserID > 0;`,会涉及多个数据关联和筛选,数据库需要处理更多的关系和数据,性能开销会更大,尤其是当关联的数据量都很大时,性能影响会更明显[^1]。 ### 其他情况 - **事务处理**:`DELETE`操作通常会影响事务,若在事务中执行`DELETE`操作,在事务提交或回滚前,数据删除状态是临时的。如果事务较大且包含大量的`DELETE`操作,可能会占用较多的系统资源和事务日志空间。 - **数据恢复**:删除操作是可逆的(除非有备份),在删除数据前需谨慎考虑。有些数据库提供了软删除的方式,即通过修改数据的状态字段来标记数据为已删除,而是真正从物理上删除数据,这样可在需要时恢复数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值