我有一个密码恢复系统,允许用户通过电子邮件恢复他们的密码。每个请求的详细信息都会插入到我的recoveries
表中,并在成功恢复后删除。我有每个恢复创建后10分钟设置的每次恢复的时间戳。
我想实现一个系统,它会在10分钟后自动删除每个过期的恢复。由于每个行的到期时间都不同,这意味着使用cron作业在执行此任务时会非常无效。
实现这一目标的最有效方法是什么?
这是我的代码:
$time = time();
$recoveries = DB::fetch("DELETE FROM `recoveries` WHERE `expiry` <= ?;", array($time));
答案 0 :(得分:4)
最有效的方法是使用视图。咦?这与问题有什么关系?好吧,不要在病房后10分钟进行删除。而是使用以下逻辑创建视图:
create view v_recoveries as
select r.*
from recoveries r
where expiry > date_sub(now(), interval 10 minutes);
对于性能,您需要recoveries(expiry)
上的索引,因此这应该很快。
然后,在您闲暇时 - 每个日期,或每小时一次,或每周一次 - 删除不需要的记录:
DELETE FROM `recoveries`
WHERE `expiry` <= date_sub(now(), interval 10 minutes);
这种方法有几个优点:
答案 1 :(得分:0)
您可以在mysql级别编写触发器函数,当插入/更新条目时,它将触发该函数,该函数将删除此特定用户的所有条目(或超过10分钟的条目)。 这样您就不必每1分钟检查一次(cron作业),看看要从数据库中删除的条目(这将使您的生活变得轻松,并将节省一些资源。)
当任何人登录时(如果你不想在mysql级别使用触发器),你也可以实现这种技术。