我通过python使用MySQL数据库来存储日志。我想知道,如果行数超过限制,是否有有效的方法删除最老的行。
我能够这样做,方法是执行一个查询来查找总行,然后通过在升序和删除中排列旧行来删除旧行。但是这种方法花费了太多的时间。是否有一种方法可以通过在创建表的同时制定规则来提高效率,以便MySQL本身在超过限制时注意到?
提前谢谢。
发布于 2022-04-26 21:58:00
在MySQL中,没有简单和内置的方法来实现这一点。
在插入新行时使用触发器删除旧行的解决方案有风险,因为触发器可能会失败。或者引发触发器的事务可能回滚。在任何一种情况下,您的预定删除都不会发生。
同时,在插入新数据的线程上增加删除的负担也会导致insert请求的额外工作,而且通常我们不希望使当前用户的操作更慢。
更常见的做法是定期运行异步作业以删除旧数据。这可以安排在下班时间运行,并分批运行。它还提供了更大的灵活性来存档旧数据,或者在删除或归档失败或中断时执行重试。
MySQL确实支持事件系统,因此您可以根据计划运行存储的例程。但是,您只能在存储的例程中执行您可以执行的任务,要让它重试或存档到任何外部系统(例如云存档),或者在完成时通知您是不容易的。
对不起,没有简单的解决办法。在人们希望它工作的方式上有太多的变化,还有太多的潜在失败的边缘案例。
实现这一点的方法是使用cron,或者在我的web服务中使用一个计时器线程来检查数据库,比如每小时一次。如果发现行数大于限制,则会删除最小大小的批(例如每次1000行)中最老的行,直到计数低于阈值为止。
我喜欢以一种易于控制和监视的方式编写计划作业。因此,我可以让它立即运行,如果我想,我可以禁用或恢复计划,如果我想,我可以查看进度报告,它删除了多少,上次运行,以及多久,直到下一次运行,等等。
https://stackoverflow.com/questions/72020397
复制相似问题