Saya telah menulis skrip PHP untuk memuat data secara massal yang diterbitkan oleh dump data Stack Overflow. Saya mengimpor jutaan baris dan tidak butuh waktu lama.
Berikut beberapa kiatnya:
-
Jangan mengandalkan komit otomatis. Overhead untuk memulai dan melakukan transaksi untuk setiap baris sangat besar. Gunakan transaksi eksplisit, dan lakukan setelah setiap 1000 baris (atau lebih).
-
Gunakan pernyataan yang sudah disiapkan. Karena pada dasarnya Anda melakukan sisipan yang sama ribuan kali, Anda dapat menyiapkan setiap sisipan sebelum mulai mengulang, dan kemudian mengeksekusi selama pengulangan, meneruskan nilai sebagai parameter. Saya tidak tahu bagaimana melakukan ini dengan perpustakaan database CodeIgniter, Anda harus mengetahuinya.
-
Setel MySQL untuk impor. Meningkatkan buffer cache dan sebagainya. Lihat Kecepatan Pernyataan INSERT untuk informasi lebih lanjut.
-
Gunakan LOAD DATA INFILE. Jika memungkinkan. Ini benar-benar 20x lebih cepat daripada menggunakan INSERT untuk memuat data baris demi baris. Saya mengerti jika Anda tidak bisa karena Anda perlu mendapatkan id sisipan terakhir dan seterusnya. Namun dalam kebanyakan kasus, bahkan jika Anda membaca file CSV, mengatur ulang dan menuliskannya ke beberapa file CSV sementara, pemuatan data masih lebih cepat daripada menggunakan INSERT.
-
Lakukan secara offline. Jangan menjalankan tugas yang berjalan lama selama permintaan web. Batas waktu permintaan PHP akan mengakhiri pekerjaan, jika tidak hari ini maka Selasa depan ketika pekerjaan 10% lebih lama. Sebagai gantinya, buat antrean permintaan web sebagai pekerjaan, lalu kembalikan kontrol ke pengguna. Anda harus menjalankan impor data sebagai proses server, dan secara berkala mengizinkan pengguna untuk melihat sekilas tingkat kemajuan. Misalnya, cara murah untuk melakukannya adalah agar skrip impor Anda menghasilkan "." ke file temp, dan kemudian pengguna dapat meminta untuk melihat file temp dan terus memuat ulang di browser mereka. Jika Anda ingin menjadi mewah, lakukan sesuatu dengan Ajax.