
Pendahuluan
Bayangin lagi ngerjain fitur import data skala besar, tapi aplikasinya malah timeout karena Laravel sibuk banget nge-looping ribuan query ke database. Ini masalah klasik yang sering banget bikin performa aplikasi drop drastis kalau kita cuma pakai model save biasa di dalam loop. Saya sendiri pernah kena masalah ini di project dashboard inventaris yang mengharuskan update stok ribuan barang sekaligus, dan ternyata solusinya bukan sekadar menambah limit memory PHP.
Tips & Best Practices
Di banyak project, biasanya saya mulai dari membatasi ukuran chunk agar memory tetap aman. Pertama, jangan pernah nge-insert data sekaligus jutaan baris dalam satu query karena bisa kena limit packet database; selalu pecah jadi bagian-bagian kecil (chunking) agar proses lebih stabil. Kedua, manfaatkan fitur upsert bawaan Laravel. Waktu dulu harus update ribuan user sekaligus, saya sadar kalau nge-query satu-satu itu membunuh performa, jadi pakai query builder yang lebih dekat ke raw SQL jauh lebih ngebut. Ketiga, kurangi pemanggilan event model. Kadang kita lupa kalau Eloquent itu punya banyak overhead seperti event saving atau updating yang bisa bikin proses jadi lambat kalau dijalankan ribuan kali.
Contoh Kode
Berikut adalah cara paling efisien menggunakan method upsert yang sangat powerful untuk skenario insert sekaligus update:
// Update jika ID sudah ada, insert jika belum
DB::table('products')->upsert([
['id' => 1, 'stock' => 50, 'updated_at' => now()],
['id' => 2, 'stock' => 30, 'updated_at' => now()],
], ['id'], ['stock', 'updated_at']);Variasi Implementasi
Kalau datanya sangat kompleks dan butuh relasi, mungkin kalian butuh library pihak ketiga seperti thiagoprz/laravel-bulk-upsert. Tapi kalau cuma buat tabel flat, native DB::table()->upsert() sudah lebih dari cukup. Bedanya, pakai Eloquent model memang terasa lebih elegan, tapi untuk performa tinggi, langsung tembak lewat Query Builder jauh lebih enteng di RAM karena kita bypass instansiasi object model yang berat.
Kesalahan Umum
1. Lupa mematikan disableQueryLog() saat proses bulk, yang akhirnya malah bikin RAM jebol. 2. Melakukan query di dalam loop foreach tanpa pembatasan, ini musuh utama database. 3. Tidak memberikan index pada kolom yang jadi acuan upsert, jadi database harus scan ulang tabel terus-terusan. 4. Menaruh logika bisnis yang berat di dalam model event yang dipicu setiap kali insert satu baris. 5. Terlalu percaya diri dengan memory limit server tanpa melakukan testing dengan data dummy yang besar.
Ringkasan
Intinya, handling data dalam jumlah masif di Laravel itu soal menyeimbangkan antara kemudahan fitur Eloquent dan kecepatan Query Builder. Setelah paham pola bulk insert dan update ini, project saya yang tadinya lemot pas import data jadi jauh lebih enteng. Jangan takut buat bereksperimen dengan raw query kalau memang performa jadi prioritas utama di tahap akhir pengembangan.
Komentar
Posting Komentar