Cara Impor File CSV Berukuran Besar ke MySQL dengan LOAD DATA INFILE

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.

Alur Impor CSV ke MySQL
Alur Impor CSV ke MySQL

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 ErrorPenyebab & Solusi
The MySQL server is running with –secure-file-privFile harus diletakkan di folder yang diizinkan. Cek dengan SHOW VARIABLES LIKE 'secure_file_priv' lalu pindahkan file ke folder itu.
Loading local data is disabledAktifkan local_infile di server dan klien.
Data terpotong / kolom bergeserPeriksa 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.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *