La manière la plus efficace de le faire est d'utiliser une vue. Hein? Qu'est-ce que cela a à voir avec le problème? Eh bien, ne faites pas la suppression 10 minutes après les salles. Créez plutôt une vue avec la logique suivante :
create view v_recoveries as
select r.*
from recoveries r
where expiry > date_sub(now(), interval 10 minutes);
Pour les performances, vous voulez un index sur les recoveries(expiry)
, cela devrait donc être rapide.
Ensuite, à votre guise - une fois par date, une fois par heure ou une fois par semaine - supprimez les enregistrements inutiles avec :
DELETE FROM `recoveries`
WHERE `expiry` <= date_sub(now(), interval 10 minutes);
Cette approche présente plusieurs avantages :
- La présence de données dure exactement 10 minutes, plutôt que d'être basée sur la planification d'une tâche.
- Les suppressions réelles peuvent avoir lieu lorsque le système est inactif.
- Si une tâche cron ne s'exécute pas, les données ne sont pas "corrompues", c'est-à-dire que vous n'obtenez pas de données trop anciennes.
- Si le système est occupé (beaucoup d'insertions), les insertions ne sont pas en concurrence avec les suppressions, ce qui ralentit davantage le système.