Saya memiliki tabel Notifikasi berisi sekitar 100 juta baris host di Amazon RDS dengan 1000 IOPS, dan saya ingin menghapus baris yang lebih lama dari satu bulan.
Jika saya melakukannya DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
, semua IOPS akan diambil, prosesnya akan memakan waktu berjam-jam, dan banyak entri baru tidak dapat dimasukkan karena "Kunci waktu tunggu tunggu terlampaui; coba mulai ulang transaksi".
Saya mencoba melakukan cara yang dijelaskan di sini: http://mysql.rjweb.org/doc.php/deletebig Namun, saya menggunakan UUID sebagai ganti increment ID.
Apa cara yang benar dan efisien untuk menghapus baris-baris itu tanpa memengaruhi data baru yang disisipkan / perbarui?
Jawaban:
Buat tabel temp, ganti masuk dan keluar, dan salin data 30 hari terakhir ke dalamnya.
Di jam-jam libur Anda, jatuhkan meja lama
Inilah Keuntungan melakukan DELETE seperti ini
NOTIFICATION
dikosongkan dengan cepat dengan cara beralih di meja kosong.NOTIFICATION
segera tersedia untuk INSERT baruNOTIFICATION
saat INSERT baru dapat berlangsung.NOTIFICATION
tidak mengganggu INSERT baruCobalah !!!
sumber
ALTER TABLE ENGINE=InnoDB
untuk mengecilkan tabel.Favorit saya adalah pengarsip-pt dari Percona Toolkit. Ini mengurus beban MySQL, replikasi lag.
sumber
buat tabel notification_temp sebagai pilih * dari notifikasi tempat CreatedAt <DATE_SUB (CURDATE (), INTERVAL 30 hari);
pemberitahuan drop table;
RENAME notification_temp TO NOTIFICATION;
sumber
CREATE TABLE
terjawab.RENAME TABLE notification_temp ...