Mengimpor data dalam jumlah besar — katakanlah puluhan ribu hingga jutaan baris — dari file CSV ke MySQL bisa menjadi mimpi buruk jika dilakukan dengan INSERT satu per satu. Untungnya MySQL punya perintah khusus yang dirancang persis untuk pekerjaan ini: LOAD DATA INFILE. Perintah ini bisa berkali-kali lipat lebih cepat karena membaca file langsung di sisi server.

Mengapa Bukan INSERT Biasa?
Setiap perintah INSERT membawa overhead: parsing query, pengecekan indeks, penulisan log, dan komit. Kalau dijalankan 100.000 kali, akumulasi overhead itu sangat besar. LOAD DATA INFILE memproses seluruh file dalam satu operasi besar, meminimalkan overhead, sehingga impor yang tadinya berjam-jam bisa selesai dalam hitungan detik atau menit.
Menyiapkan Tabel dan File CSV
Anggap kita punya file pelanggan.csv seperti berikut (baris pertama adalah header):
nama,email,kota,saldo Rani,rani@mail.com,Bandung,150000 Dimas,dimas@mail.com,Surabaya,90000 Sari,sari@mail.com,Medan,200000
Dan tabel tujuannya:
CREATE TABLE pelanggan (
id INT PRIMARY KEY AUTO_INCREMENT,
nama VARCHAR(60),
email VARCHAR(80),
kota VARCHAR(40),
saldo INT
);
Perintah LOAD DATA INFILE Dasar
LOAD DATA INFILE 'C:/data/pelanggan.csv' INTO TABLE pelanggan FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (nama, email, kota, saldo);
Mari kita bedah tiap barisnya:
FIELDS TERMINATED BY ','— pemisah antar-kolom adalah koma (khas CSV).ENCLOSED BY '"'— nilai teks yang diapit tanda kutip ganda diperlakukan sebagai satu kolom (berguna bila datanya sendiri mengandung koma).LINES TERMINATED BY '\n'— tiap baris dipisah oleh baris baru. Untuk file dari Windows, kadang perlu'\r\n'.IGNORE 1 LINES— melewati baris header agar tidak ikut terimpor sebagai data.- Daftar kolom di akhir memetakan urutan kolom di CSV ke kolom tabel.
LOCAL: Mengimpor dari Sisi Klien
Perintah di atas mencari file di server database. Kalau file berada di komputer klien (misalnya laptop Anda yang terhubung ke server jarak jauh), tambahkan kata kunci LOCAL:
LOAD DATA LOCAL INFILE 'C:/data/pelanggan.csv' INTO TABLE pelanggan FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES (nama, email, kota, saldo);
Agar LOCAL berfungsi, opsi local_infile harus diaktifkan di server maupun klien. Anda bisa memeriksanya dengan:
SHOW VARIABLES LIKE 'local_infile';
Bila hasilnya OFF, aktifkan dengan perintah berikut (perlu hak akses admin):
SET GLOBAL local_infile = 1;
Transformasi Data Saat Impor
Salah satu fitur terkuat LOAD DATA adalah kemampuan mengolah data saat impor menggunakan variabel dan klausa SET. Contoh, mengubah teks tanggal menjadi format DATE dan mengisi kolom waktu impor:
LOAD DATA INFILE 'C:/data/transaksi.csv'
INTO TABLE transaksi
FIELDS TERMINATED BY ','
IGNORE 1 LINES
(kode, @tgl, nominal)
SET tanggal = STR_TO_DATE(@tgl, '%d/%m/%Y'),
diimpor_pada = NOW();
Kolom yang diawali @ adalah variabel penampung sementara — nilainya tidak langsung masuk tabel, melainkan diolah dulu di klausa SET.
Tips Mempercepat Impor Sangat Besar
- Nonaktifkan sementara pengecekan. Sebelum impor jutaan baris, matikan pengecekan yang memperlambat, lalu nyalakan lagi setelah selesai:
SET autocommit = 0; SET unique_checks = 0; SET foreign_key_checks = 0; -- jalankan LOAD DATA INFILE di sini COMMIT; SET unique_checks = 1; SET foreign_key_checks = 1;
- Impor dulu, indeks belakangan. Bila memungkinkan, buat indeks setelah data masuk, bukan sebelumnya.
- Pastikan tipe kolom sesuai agar MySQL tidak boros melakukan konversi implisit.
Mengatasi Error yang Sering Muncul
| Pesan Error | Penyebab & Solusi |
|---|---|
| The MySQL server is running with –secure-file-priv | File harus diletakkan di folder yang diizinkan. Cek dengan SHOW VARIABLES LIKE 'secure_file_priv' lalu pindahkan file ke folder itu. |
| Loading local data is disabled | Aktifkan local_infile di server dan klien. |
| Data terpotong / kolom bergeser | Periksa pemisah kolom dan akhir baris (\n vs \r\n). |
Contoh Kasus Nyata: Impor Data Penduduk
Sebuah instansi perlu mengimpor 500.000 baris data penduduk dari file ekspor Excel yang disimpan sebagai CSV. Dengan skrip PHP INSERT per baris, prosesnya memakan lebih dari satu jam dan sering timeout. Setelah beralih ke LOAD DATA INFILE dengan foreign_key_checks dimatikan sementara, impor selesai di bawah dua menit. Inilah alasan perintah ini menjadi andalan untuk migrasi data massal.
Penutup
LOAD DATA INFILE adalah cara tercepat dan paling andal untuk memasukkan data CSV berukuran besar ke MySQL. Kuasai opsi pemisah kolom, penanganan header, dan transformasi SET, maka tugas impor data massal yang tadinya menyita waktu akan berubah menjadi pekerjaan singkat.
Referensi: untuk pendalaman lebih lanjut, kunjungi dokumentasi resmi MySQL.

