De meest efficiënte manier om dit te doen, is door een weergave te gebruiken. Hoezo? Wat heeft dat met het probleem te maken? Doe de verwijdering niet 10 minuten na de afdelingen. Maak in plaats daarvan een weergave met de volgende logica:
create view v_recoveries as
select r.*
from recoveries r
where expiry > date_sub(now(), interval 10 minutes);
Voor prestaties wilt u een index op recoveries(expiry)
, dus dit zou snel moeten zijn.
Verwijder vervolgens op uw gemak -- één keer per datum, of één keer per uur, of één keer per week -- onnodige records met:
DELETE FROM `recoveries`
WHERE `expiry` <= date_sub(now(), interval 10 minutes);
Deze aanpak heeft verschillende voordelen:
- De aanwezigheid van gegevens is precies 10 minuten, in plaats van gebaseerd op de planning van een taak.
- De daadwerkelijke verwijderingen kunnen plaatsvinden wanneer het systeem in rust is.
- Als een cron-taak niet wordt uitgevoerd, zijn de gegevens niet "beschadigd" -- dat wil zeggen, u krijgt geen gegevens die te oud zijn.
- Als het systeem druk is (veel inserts), concurreren de inserts niet met verwijderingen, wat het systeem verder vertraagt.