去年,我正在为大学开展一个项目,其中一个功能需要数据库中的记录以几乎秒级的精度到期(即创建后恰好 x 分钟/小时)。我说“几乎”是因为几秒钟对我来说可能并不意味着世界末日,尽管我可以想象在拍卖网站之类的地方,这可能很重要(我相信这些类型的网站使用不同的措施,但仅作为示例)。
我对 MySQL 事件进行了研究并最终使用了它们,尽管现在我回想起来我想知道是否有更好的方法来做我所做的事情(这并不是那么精确或高效)。我可以想到三种方法使用事件来实现这一点 - 我想知道这些方法是否有效且高效,或者是否有更好的方法:
安排一个事件每秒运行一次并更新过期记录。我想随着记录数量的增加并且执行时间超过一秒,这会导致问题,甚至可能会干扰正常的数据库操作。如我错了请纠正我。
安排每半小时左右运行一次的事件(实际上可以是任何时间间隔),更新过期记录。同时,在查询数据库时强加选择标准,只返回过期日期尚未过去的记录,这样自上次事件执行后过期的任何记录都不会被检索到。虽然这在检索时是准确的,但它首先破坏了事件的目的,并且我认为额外的选择标准会减慢选择查询的速度。在我去年的项目中,我使用了这种方法,更新记录的事件实际上仅用于后端日志记录。
在插入时,有一个触发器来创建特定于记录的动态事件,该事件将在它应该到期的时候准确地到期。到期后,删除该事件。我觉得这将是一个很好的方法,但我不太确定一次运行这么多事件是否会影响数据库的性能(想象一个每小时甚至有 60 次插入的数据库 - 那是 60事件全部同时运行仅一小时。随着时间的推移,这取决于到期时间的长短,这会加起来)。
我确信有更多的方法可以做到这一点——也许使用在 RDBMS 外部运行的单独脚本是一种选择——但这些是我正在考虑的。如果有人对您如何精确地使记录过期有任何见解,请告诉我。
此外,尽管事实上我过去确实使用过它,但我不太喜欢方法 2,因为虽然这适用于记录过期,但如果不是在准确的时间过期记录,它并没有真正帮助我,我想让它在某个时间激活(即博客站点中的预定帖子)。因此,出于这个原因,如果您有一种方法可以在准确的时间更新记录,无论该更新做什么(过期或发布),我都会很高兴听到它。