Menghapus data mysql dalam jumlah besar (4 juta baris) secara efisien, secara teratur

10

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.

CPU melonjak di tengah malam

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.


sumber
mungkin Gunakan pekerjaan cron untuk menghapus setiap 10 menit dan 100rb putaran atau setiap 5 menit 50rb putaran
potongan yang lebih kecil secara teratur?
ok, tapi sepertinya itu hanya akan melumpuhkan pengalaman pengguna kami untuk jangka waktu yang lebih lama :) apa pun yang bisa kita lakukan dengan permintaan / desain?
1
Pengguna 186k, tidak ada pria db khusus?
1
Anda akan mendapatkan jawaban yang lebih baik pada "Administrator Database"
James Anderson

Jawaban:

13

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 endTimedi 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.

Gordon Linoff
sumber
wow, itu sangat membantu, dan sepertinya solusi yang sempurna. Saatnya membaca tentang mempartisi! Terima kasih!
Meskipun mempartisi mungkin merupakan solusi yang baik, waspadalah terhadap overhead - ini dapat memperlambat permintaan Anda secara signifikan. Selain itu truncate table juga tidak instan. Saya akan mempertimbangkan pt-archiver. Anda dapat memecahkan masalah Anda dengan paku dan menjaga meja Anda sesederhana seperti sekarang
akuzminsky