Kami memiliki tabel mysql yang pada waktu tertentu memiliki sekitar 12 juta baris. Kami perlu menghapus data lama untuk menjaga ukuran tabel agar dapat dikelola.
Saat ini kami menjalankan kueri ini setiap hari, tengah malam, menggunakan pekerjaan cron:
DELETE FROM table WHERE endTime < '1393632001'
Terakhir kali kueri menjalankannya memeriksa 4.602.400, membutuhkan waktu lebih dari 3 menit dan CPU melewati atap.
Apa yang bisa kita lakukan untuk menjaga agar CPU, koneksi db sinkron, kedalaman cue disk, dll agar tidak melonjak tidak masuk akal sembari masih membersihkan data lama?
PS: Anda akan melihat bahwa permintaan sebenarnya terjadi pada waktu yang tidak tepat dalam siklus penggunaan kami. Asumsikan bahwa kami telah menggeser waktu kueri untuk terjadi pada titik penggunaan terendah setiap hari. Juga, tidak ada indeks pada "endTime" dan saya lebih suka untuk tetap seperti itu jika mungkin karena ada satu ton data yang dimasukkan secara teratur, dan tidak banyak pencarian.
Jawaban:
Solusi untuk masalah Anda adalah kemampuan MySQL yang disebut "partisi". Dokumentasinya ada di sini .
Apa yang dilakukan dengan mempartisi adalah menyimpan satu tabel dalam "partisi" terpisah. Ini didefinisikan oleh ekspresi tertentu, biasanya nilai atau rentang kolom. Dalam kasus Anda, ini mungkin akan didasarkan pada
endTime
- dengan asumsi bahwa itu diketahui ketika catatan dibuat dan tidak berubah.Anda akan menyimpan nilai satu hari
endTime
di setiap partisi. Maka langkah penghapusan akan memotong sebuah partisi daripada menghapus sekelompok baris dalam tabel besar. Pemotongan partisi akan menjadi metode yang jauh lebih cepat.sumber