LOAD DATA INFILE dan INSERT yang diperluas masing-masing memiliki keunggulan berbeda.
LOAD DATA INFILE dirancang untuk memuat data tabel secara massal dalam satu operasi bersama dengan lonceng dan peluit untuk melakukan hal-hal seperti:
- Melewati Garis Awal
- Melewati Kolom Khusus
- Mengubah Kolom Tertentu
- Memuat Kolom Tertentu
- Menangani Masalah Kunci Duplikat
Lebih sedikit overhead yang diperlukan untuk penguraian
Di sisi lain, jika Anda hanya mengimpor 100 baris, bukan 1.000.000 baris, INSERT yang diperluas masuk akal.
Perhatikan bahwa mysqldump dirancang di sekitar INSERT yang diperluas demi membawa desain tabel bersama dengan data saat ia melakukan injeksi ratusan atau ribuan baris per INSERT. LOAD DATA INFILE selalu menciptakan dichomoty fisik antara skema dan data.
Dari sudut pandang aplikasi, LOAD DATA INFILE juga lebih tidak sensitif terhadap perubahan skema daripada INSERT yang diperluas.
Seseorang dapat bolak-balik pada yang baik, yang buruk, dan buruk menggunakan LOAD DATA INFILE. Apa pun teknik yang Anda gunakan, Anda harus selalu mengatur bulk_insert_buffer_size . Mengapa?
Menurut Dokumentasi MySQL di bulk_insert_buffer_size:
MyISAM menggunakan cache mirip pohon untuk membuat sisipan massal lebih cepat untuk INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., dan LOAD DATA INFILE saat menambahkan data ke nonempty meja. Variabel ini membatasi ukuran pohon cache dalam byte per utas. Menetapkannya ke 0 menonaktifkan pengoptimalan ini. Nilai default adalah 8MB.
Selama bertahun-tahun, saya telah melihat klien setelah klien tidak mengatur ini dan membiarkannya pada 8MB. Kemudian, ketika mereka memutuskan untuk menggunakan LOAD DATA INFILE atau mengimpor mysqldumps, mereka dapat merasakan sesuatu yang salah. Saya biasanya merekomendasikan pengaturan ini ke 256M moderat. Dalam beberapa kasus, 512M.
Setelah Anda memiliki buffer INSERT massal yang cukup besar, menggunakan teknik mana pun diberikan secara akademis dan bermuara pada pilihan pribadi. Untuk aplikasi tempat Anda memasukkan INSERT massal hanya 100 baris sesuai permintaan, tetap menggunakan INSERT yang diperluas.
Dalam semua kewajaran, mengatakan LOAD DATA INFILE lebih cepat daripada pernyataan INSERT normal adalah jenis pernyataan yang dimuat terutama karena konfigurasi tidak diperhitungkan. Bahkan jika Anda menyiapkan patokan antara LOAD DATA INFILE dan INSERT yang diperluas dengan bulk_insert_buffer_size yang tepat, nanosecond yang disimpan pada penguraian setiap baris hanya dapat menghasilkan hasil nominal yang paling baik dalam mendukung LOAD DATA INFILE.
Silakan dan tambahkan ini ke my.cnf
[mysqld]
bulk_inset_buffer_size=256M
Anda juga dapat mengaturnya hanya untuk sesi Anda sebelum meluncurkan INSERT yang diperluas
SET bulk_insert_buffer_size= 1024 * 1024 * 256;
UPDATE 2012-07-19 14:58 EDT
Untuk menjaga hal-hal dalam perspektif, buffer penyisipan massal hanya berguna untuk memuat tabel MyISAM, bukan InnoDB. Saya menulis posting yang lebih baru tentang pemuatan massal InnoDB: Beban Mysql dari infile macet menunggu di hard drive
LOAD DATA INFILE
: insert berkecepatan tinggi dengan MySQL . Intinya: Anda dapat mencapai 65% dari kinerjaLOAD DATA INFILE
menggunakan sisipan yang diperluas. Saya mendapat 240.000 sisipan / detik pada perangkat keras modern.