如何限制mysql中的行数,如果超过则删除旧行



我使用MySQL数据库通过python存储日志。我想知道如果行数超过限制,是否有任何有效的方法来删除最老的行。
我可以通过执行查询来查找总行,然后通过升序排列和删除来删除较旧的行。但这种方法耗时太长。是否有一种方法可以通过在创建表时制定规则来提高效率,以便MySQL本身在超出限制时进行处理?
谢谢。

在MySQL中没有简单的内置方法来做到这一点。

在插入新行时使用触发器删除旧行的解决方案是有风险的,因为触发器可能失败。或者生成触发器的事务可能会回滚。在这两种情况下,您所期望的删除都不会发生。

同样,将删除的负担放在插入新数据的线程上会导致插入请求的额外工作,通常我们不希望使当前用户的速度变慢。

更常见的是定期运行异步作业来删除旧数据。这可以安排在非工作时间运行,并分批运行。它还提供了更大的灵活性来归档旧数据,或者在删除或归档失败或中断时执行重试。

MySQL支持EVENT系统,因此您可以基于调度运行存储例程。但是你只能在存储例程中完成任务,并且不容易让它重试,或者存档到任何外部系统(例如云存档),或者在完成时通知你。

对不起,没有简单的解决办法。人们希望它如何工作的方式有太多的变化,以及太多潜在失败的边缘情况。

我要实现这一点的方式是使用cron或其他定时器线程在我的web服务检查数据库,说每小时一次。如果它发现行数大于限制,它以中等大小的批(例如一次1000行)删除最旧的行,直到计数低于阈值。

我喜欢用一种容易控制和监控的方式来写计划好的作业。所以我可以让它立即运行,如果我想,我可以禁用或恢复计划,如果我想,我可以查看进度报告,关于它上次运行时删除了多少,以及距离下一次运行还有多长时间,等等。

最新更新