Saya memiliki proses impor yang berjalan sangat sering dan saya ingin itu menjadi semacam 'semua atau tidak sama sekali' kesepakatan, alias: transaksi.
Ada banyak aspek, dan impor dapat menghasilkan di mana saja antara 100k-1mil + catatan. Ini sama dengan muatan mulai dari beberapa MB hingga beberapa ratus MB data.
Saya tahu tabel temp adalah pilihan lain - tetapi metode ini tampaknya sangat berguna.
Adakah peringatan yang harus diperhatikan tentang praktik semacam ini dengan sejumlah besar manipulasi data di antara komitmen? (Di luar dari burst penulisan / pengindeksan umum yang dilakukan setelah berkomitmen)
mysql
innodb
mysql-5.5
transaction
es tipis
sumber
sumber
Jawaban:
Satu hambatan yang harus diperhatikan adalah InnoDB Log Buffer. Ukurannya diatur oleh innodb_log_buffer_size . Inilah yang dikatakan oleh Dokumentasi MySQL tentangnya:
Buffer Log InnoDB tidak boleh disamakan dengan Pool Buffer InnoDB. Perbedaan utama di antara mereka adalah tujuan mereka. Buffer Log InnoDB pada dasarnya akan merekam perubahan jangka pendek yang bisa ditulis ke redo log (ib_logfile0, ib_logfile1). Pool Buffer InnoDB (berukuran oleh innodb_buffer_pool_size ) menyimpan cache data dan indeks halaman yang akan dikomit (jika halaman tersebut kotor) dan akhirnya ditulis) ke disk. Setelah dilakukan, halaman perubahan tetap dalam RAM sampai dihapus melalui aturan LRU.
Transaksi besar harus disalurkan melalui Buffer Log. Seperti yang disebutkan, buffer log yang lebih besar akan mengurangi disk I / O. Hanya komit besar yang akan memberikan hambatan.
Anda mungkin ingin melihat opsi InnoDB lain untuk dikonfigurasikan.
Saya punya posting lain tentang mengoptimalkan InnoDB untuk penelitian lebih lanjut
sumber