mysql清除时间段数据库_删除mysql数据库表中指定时间段内的数据-Go语言中文社区...

场景:发现mysql数据库中的一个数据库的某张记录日志的表都2G多了,用mysql客户端打开时,都报out of memory.

8f452e82d65ae117e54c7fcb8b3f1dfb.png

而且版本更新迭代快,测试平台的日志保存一个月内的足够用了,没有必要保存太长时间。

鉴于此,用命令行的方式执行一条delete命令来删除该表中的数据,只保留1个月左右的日志。

04eecc4a953fbc5aa99b15ad2a1a917c.png

DELETE FROM test_logdetail WHERE logtime BETWEEN '2018-01-01 00:00:00' AND '2019-04-30 00:00:00'--删除test_logdetail表中2018年1月1日到2019年4月30日的数据

本以为,执行该语句后,占用的空间会降下来,可是查了下,发现,占用的空间并没有减少。

0d2eb8a72ab2113c0ab584e6801ec0e6.png

原来,当DELETE后面跟条件的时候,则就会出现这个问题,delete from table_name where 条件删除数据后,数据表占用的空间大小不会变。 如果已经删除了表数据的很大一部分,或者有很多变化和变长表行(VARCHAR表,VARBINARY、BLOB或文本列)进行了更改,因为删除操作后在数据文件中留下碎片所致。DELETE只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间,可以使用OPTIMIZE TABLE来回收未使用的空间,并整理数据文件的碎片。

注意: OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

于是,继续执行:

e81c3e758b9668a1bcf054e386c7e8c0.png

然后再去查看数据库,发现该表所占用的空间变小了:

46f48af9f0707484af0c07b33a8b38c5.png

备注:

删除数据库表一般来说有三种方法:

1、当你不再需要该表时, 用 drop; drop 是直接将表格删除,无法找回;

2、当你仍要保留该表,但要删除所有记录时, 用 truncate; truncate删除后不记录mysql日志,因此不可以rollback,更不可以恢复数据;

3、当你要删除部分记录或者有可能会后悔的话, 用 delete。 可以与where连用,删除特定行;

鉴于我们需要保留差不多1个月的日志记录,drop和truncate都不合适,只能使用delete来删除数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值