如何将数据库中的数据只保留 3 天左右

2016 年 12 月 27 日
 llx126753
数据库现在保留了 7 天的数据,大小差不多 180g 左右,做了计划任务,每天将数据进行清理, delete from log where create_time < from_unixtime(unix_timestamp(now())-6*24*3600,'%Y-%m-%d') limit 100000; 像这样子删除数据,数据占用空间还是没有减少。。百度说是因为这样子删除会有碎片什么的,,求大神提供一个更好地方案
6117 次点击
所在节点    MySQL
19 条回复
llx126753
2016 年 12 月 27 日
每天的数据量比较大,这个没法集中处理数据
xiaohanqing
2016 年 12 月 27 日
表引擎
j717273419
2016 年 12 月 27 日
那能不能在清理之后,调用碎片整理?
i4oolish
2016 年 12 月 27 日
什么数据库, 什么存储引擎
R18
2016 年 12 月 27 日
分表?我们系统跑了两个月 200 多 G 数据 我给按天放的,就是为了以后删除方便
fds
2016 年 12 月 27 日
别存数据库了,每天建个目录,以文件形式存储。既然可以随便删,想必也不需要数据库那么高的安全性。
mm163
2016 年 12 月 27 日
新记录不要每次都 INSERT :创建新记录前先取一条 3 天前 create_time 值最小的记录,把该记录 UPDATE 成新记录(如果没有取到 3 天前的记录,则 INSERT )。
ty89
2016 年 12 月 27 日
看到百度说三个字我就懒得正儿八经回复了
est
2016 年 12 月 27 日
没 commit ?
isolation level 是啥?
simple2025
2016 年 12 月 27 日
关注。等大神回复
em70
2016 年 12 月 27 日
每天建个表嘛
akira
2016 年 12 月 27 日
msg7086
2016 年 12 月 28 日
然而你重新写入的时候空间占用也不会变大啊。
删除不释放不是很正常么,要是一直释放,那硬盘不被你跑死啊。
Livid
2016 年 12 月 28 日
1. 确保开启了 InnoDB 的 file per table ,这样每个表是一个单独的文件,不会出现一个几百 G 甚至上 T 的巨大文件:

https://dev.mysql.com/doc/refman/5.6/en/innodb-multiple-tablespaces.html

2. 这种类型的数据可以按天建表,这样如果需要删除的话,直接 DROP TABLE 即可。
ragnaroks
2016 年 12 月 28 日
按天分表+1,做个自动备份+删除脚本
simple2025
2016 年 12 月 28 日
@ragnaroks 能问下代码怎们办?总不可能每天改一次 python ORM 吧
ragnaroks
2016 年 12 月 28 日
@chenqh 我是直接用 shell 写的,按文件最后写入时间(修改时间)来,然后计划任务
realpg
2016 年 12 月 29 日
你的数据库是什么类型的系统数据?
是否是直接网站的数据?
如果是直接网站的数据(比如一个 PHP 网站),可以这样

所有网页请求包含一个 gc.php
内容是连上数据库执行一个查询
delete from `XXXX` where expiredtime< 现在时间 limit 5;
来一次有效访问帮你删除 5 条过期数据
PV 大的话很快就帮你分散的删干净了,对整体影响不大
具体 limit 的数值根据访问量和数据量动态调优

也可根据逻辑不同,只在静态渲染类的操作上 include 这个 gc.php
访问量太大的话,可以先判断一个随机数是否小于 20 执行这个之类
lytofb
2017 年 2 月 22 日
一天建一个表,过 7 天删除

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/330545

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX