Cara paling efisien untuk melakukan ini adalah dengan menggunakan tampilan. Hah? Apa hubungannya dengan masalahnya? Nah, jangan lakukan penghapusan 10 menit setelah bangsal. Sebagai gantinya, buat tampilan dengan logika berikut:
create view v_recoveries as
select r.*
from recoveries r
where expiry > date_sub(now(), interval 10 minutes);
Untuk kinerja, Anda menginginkan indeks pada recoveries(expiry)
, jadi ini harus cepat.
Kemudian, di waktu luang Anda -- sekali per tanggal, atau sekali per jam, atau sekali per minggu -- hapus catatan yang tidak diperlukan dengan:
DELETE FROM `recoveries`
WHERE `expiry` <= date_sub(now(), interval 10 minutes);
Pendekatan ini memiliki beberapa keuntungan:
- Data yang ada tepat 10 menit, bukan berdasarkan penjadwalan beberapa pekerjaan.
- Penghapusan sebenarnya dapat dilakukan saat sistem diam.
- Jika tugas cron gagal dijalankan, data tidak "rusak" -- artinya, Anda tidak mendapatkan data yang terlalu lama.
- Jika sistem sibuk (banyak sisipan), maka sisipan tidak bersaing dengan penghapusan, semakin memperlambat sistem.