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

How would you expire (or update) a MySQL record with precision to the expiry time?

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

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

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

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

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

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

此外,尽管我过去确实使用过它,但我不太喜欢方法 2,因为虽然这对记录过期有效,但如果不是过期记录,它并没有真正帮助我在精确的时间记录,我想让它在特定的时间激活(即博客站点中预定的 post)。因此,出于这个原因,如果您有一种方法可以在精确的时间更新记录,而不管该更新做了什么(过期或 post),我会很高兴听到它。

选项 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).

如果您知道插入的到期时间,只需将其放入 table..

  • 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

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

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