gpt4 book ai didi

mysql - 您将如何使 MySQL 记录过期(或更新)并精确到过期时间?

转载 作者:行者123 更新时间:2023-11-29 03:26:30 27 4
gpt4 key购买 nike

去年我正在为一个大学项目工作,其中一个功能要求数据库中记录的到期时间几乎精确到秒(即创建后正好 x 分钟/小时)。我说“几乎”是因为几秒钟对我来说可能并不意味着世界末日,尽管我可以想象在拍卖网站之类的东西中,这可能很重要(我确信这些类型的网站使用不同的措施,但仅作为示例)。

我研究了 MySQL 事件并最终使用了它们,尽管现在回想起来我想知道是否有更好的方法来完成我所做的事情(这不是那么精确或高效) .我可以想到三种使用事件来实现此目的的方法 - 我想知道这些方法是否有效且高效,或者是否有更好的方法:

  1. 安排一个事件每秒运行一次并更新过期记录。我想象这会导致问题,因为记录的数量增加并需要超过一秒的时间来执行,甚至可能干扰正常的数据库操作。如果我错了,请纠正我。

  2. 安排每半小时左右运行一次的事件(可以是任何时间间隔,真的),更新过期的记录。同时,施加查询数据库只返回记录时的选择标准其到期日期尚未过去,因此任何记录自上次事件执行以来过期的未检索。虽然这在检索时是准确的,它违背了目的首先举办事件,我会假设额外的选择标准会减慢选择查询的速度。在我的项目中去年,我用过这个方法,事件更新记录实际上仅用于后端日志记录目的。

  3. 在插入时,有一个触发器创建一个特定于恰好在它应该过期的时候过期的记录。到期后,删除该事件。我觉得这会是一个这样做的好方法,但我不太确定是否有这么多事件同时运行会影响数据库(想象一个每小时甚至有 60 个插入的数据库 -那是 60 个事件全部同时运行仅一小时。超过时间,具体取决于到期时间的长短,这会加起来)。

我确信有更多方法可以做到这一点 - 也许使用在 RDBMS 外部运行的单独脚本是一种选择 - 但这些是我正在考虑的方法。如果有人对如何准确地使记录过期有任何见解,请告诉我。

此外,尽管我过去确实使用过它,但我不太喜欢方法 2,因为虽然这对记录过期有效,但如果不是在一个精确的时间,我想让它在某个时间激活(即博客网站上的预定帖子)。因此,出于这个原因,如果您有一种方法可以在精确的时间更新记录,而不管该更新做什么(过期或发布),我很乐意听到它。

最佳答案

选项 3:

At insert, have a trigger that creates a dynamic event specific to the record that will expire it precisely when it should expire. After the expiry, delete the event. I feel like this would be a great method of doing it, but I'm not too sure if having so many events running at once would impact on the performance of the database (imagine a database that has even 60 inserts an hour - that's 60 events all running simultaneously for just one hour. Over time, depending on how long the expiration is, this would add up).

如果您知道插入的到期时间,只需将其放入表中即可。

  • library_record - id, ..., create_at, expire_at

并根据条件查询实时记录:

expire_at > NOW()

与发布相同:

  • library_record - id, ..., create_at, publish_at, expire_at

地点:

publish_at <= NOW() AND expire_at > NOW()

您可以设置 publish_at = create_at 以立即发布,或者在不需要时删除 create_at

如果使用正确的索引,这些中的每一个都将具有与表中的 is_live = 1 标志相当的性能,并为您省去很多与事件相关的麻烦。

此外,您还可以准确了解记录未生效的原因以及记录何时过期/何时应该轻松发布。还可以查询即将过期的记录等,轻松发送提醒。

关于mysql - 您将如何使 MySQL 记录过期(或更新)并精确到过期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35407858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com