Najskuteczniejszym sposobem na to jest użycie widoku. Co? Co to ma wspólnego z problemem? Cóż, nie rób kasowania 10 minut po totemach. Zamiast tego utwórz widok z następującą logiką:
create view v_recoveries as
select r.*
from recoveries r
where expiry > date_sub(now(), interval 10 minutes);
Aby uzyskać wydajność, potrzebujesz indeksu na recoveries(expiry)
, więc powinno to być szybkie.
Następnie, w wolnym czasie — raz na dzień, raz na godzinę lub raz w tygodniu — usuń niepotrzebne rekordy za pomocą:
DELETE FROM `recoveries`
WHERE `expiry` <= date_sub(now(), interval 10 minutes);
Takie podejście ma kilka zalet:
- Obecność danych to dokładnie 10 minut, a nie na podstawie harmonogramu jakiegoś zadania.
- Rzeczywiste usunięcia mogą mieć miejsce, gdy system jest w stanie spoczynku.
- Jeśli zadanie cron nie zostanie wykonane, dane nie są „uszkodzone” – to znaczy, nie otrzymujesz danych, które są zbyt stare.
- Jeśli system jest zajęty (wiele wstawek), to wstawki nie konkurują z usuwaniem, co dodatkowo spowalnia system.