Import Data MySQL menggunakan LOAD LOCAL INFILE

Seringkali dalam melakukan implementasi sebuah program, diperlukan sebuah inject data untuk mendapatkan data mula-mula baik dari program sebelum nya yang pernah dibuat maupun data pencatatan berupa file excel. Hal ini membuat sulit para pengembang ketika mau melakukan penarikan data awal ke dalam database. Begitu juga di tempat saya bekerja, terdapat client yang menggunakan database yang sudah tidak beredar di pasaran yaitu pervasive db, dan diperlukan penarikan data dari pervasive DB menuju database yang saya gunakan di server deploy/production di kantor, yaitu MySQL.

Data yang dapat di provide oleh vendor perusahaan lain yang bekerja sama dengan kantor kami hanya berupa csv data yang cukup banyak rows nya, dan kami memutuskan untuk melakukan pembuatan import tools untuk data tersebut, agar mudah untuk dimasukan ke dalam DB kami dengan cepat.

Pertama-tama, saya melakukan import data dengan membuat sebuah program PHP sederhana untuk melakukan read dan create insert statement untuk diinputkan ke dalam MySQL menggunakan PDO_MySQL. Tetapi pada saat penarikan data yang jumlah row nya mencapai 500k hingga 600k row, hal ini menjadi sangat lambat dan script PHP berjalan cukup lama, memakan waktu hingga 1 jam untuk melakukan import data sebanyak itu. Padahal statement insert yang dibuat sudah berupa multiple rows insert jadi bisa dikatakan seperti ini :

INSERT INTO FOO(a,b,c,d) VALUES (1,2,3,4),(5,6,7,8),(1,2,3,4),(5,6,7,8),.... hingga 10k values 

Multiple insert itu cukup lama dan akhirnya saya memutuskan untuk mencoba melakukan import menggunakan Tools dari DBeaver, yaitu import csv file. Ketike melakukan import menggunakan DBeaver Import data dengan CSV, dan menjalankan import tersebut, memerlukan waktu hampir 1 jam hanya untuk 10k row data, dan itu sangat-sangat tidak masuk akal untuk dilakukan. Data yang kami miliki ratusan ribu row, sedangkan 10k row saja memerlukan 1 jam, lebih lama daripada menggunakan code yang kami buat.

Salah satu atasan saya di kantor mengatakan, kenapa harus menggunakan code PHP dan juga DBeaver untuk import, kenapa tidak menggunakan fitur import dari SQL-Yog? Dia mengatakan bahwa 500k row hanya memakan waktu 2 second (Ya 2 second, which is INSANE). Saya melongo ketika melihat hal ini, dan benar 500k row data awal tersebut hanya memerlukan waktu sekitar 2 second untuk selesai terimport seluruhnya. Hal ini membuat saya penasaran mengenai kapabilitas SQL-Yog, kenapa kok bisa secepat itu? (Saya menggunakan DBeaver karena di kampus saya mengajar Oracle dan MS SQL Server Database, dan DBeaver support semua Database yang ada mulai dari yang terkenal sampai yang tidak)

SQ-Yog Load Into CSV dengan WINE di Linux

Setelah saya mencari tahu, dannnn ternyata SQLYog menggunakan fungsi LOAD data infile. Akhirnya saya melakukan research mengenai cara ini dan fungsi ini ternyata sudah ada sejak lama. pekerjaan import data yang seharusnya dilakukan hanya beberapa second saya kerjakan berputar hampir 1 minggu. Setidaknya belajar dari kesalahan, ya akhirnya saya dapat melakukan import data dengan cepat. Tetapi apakah LOAD DATA INFILE bisa dilakukan tanpa SQL-Yog? Jawaban nya bisa, dan akhirnya saya membuat script SQL nya untuk melakukan import. Berikut Script yang saya gunakan untuk melakukan import ke dalam MySQL dengan file CSV.

Hanya dengan 2 Langkah ke CSV akan menjadi Row Table

Jika dilihat, pertama-tama saya melakukan show variable pada line 2, untuk mengetahui apakah load infile menyala atau tidak pada server MySQL, jika belum maka lakukan update variable pada line 3 untuk memperbolehkan local infile load into. Pada line 5 dilakukan melihat lokasi penempatan file csv yang memperbolehkan csv di load dari sana, karena tidak semua folder di dalam server diperbolehkan untuk load file CSV (kecuali menggunakan SQL Yog, itu beda cerita, karena sebenarnya SQL Yog melakukan wrap semua langkah diatas).

Setelah menemukan lokasi file csv nya, pindahkan file csv ke folder tersebut (baik local maupun remote location), dan lakukan load file into table seperti pada line ke 7 hingga 14. Line 7-8 menandakan dimana lokasi file berada dan di load, pada baris ke 9, adalah tabel target dimana file akan diimport dan dimasukan, lalu padaline 10 adalah command untuk memberi tahu MySQL delimiter antar kolomnya berupa koma, pada baris ke 11 adalah menandakan apakah sebuah data dalam kolom yang memiliki karakter khusus akan diawali dan diakhiri dengan tanda petik2.

Pada baris ke 12 merupakan command untuk menunjukan pergantian baris menggunakan tanda apa, dalam script diatas menggunakan \n saja, tetapi bisa saja \r\n atau \r saja, tergantung operating system yang digunakan. Untuk baris ke 13 dilakukan ignore untuk baris teratas pada data csv yang diberikan, biasanya ini digunakan untuk menghilangkan nama kolom di baris paling atas. Line terkahir yaitu line 14 adalah line yang berfungsi untuk memilih kolom apa yang akan digunakan untuk di insertkan, jika hanya 2 kolom dari 10 kolom maka pilih kolom yang dibutuhkan, sesuai dengan kolom yang kita miliki pada csv.

Script ini bagi saya sangat membantu, dan ilmu untuk import csv yang diberikan oleh atasan saya juga berguna jika kita berhadapan dengan data bulk yang ada. Semoga ini membantu sekali bagi para pembaca. Ilmu IT selalu berkembang, dengan begitu kita harus terus belajar dan berkembang.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.