Waktu testing lokal dengan 10 data dummy, endpoint API terasa sangat instan (20ms). Tapi begitu masuk server produksi dengan 5.000 user, endpoint yang sama butuh waktu 3.8 detik. Penyebab paling umum yang sering saya temukan pada kode junior adalah N+1 Query Problem.
Apa Itu Masalah N+1?
Terjadi ketika kode mengambil daftar parent (1 query), lalu di dalam perulangan loop mengambil child record satu per satu (N query). Jika ada 100 invoice, aplikasi menembak 101 kali query ke database server!
Solusi: Eager Loading
// BURUK: N+1 Query
$invoices = Invoice::all();
foreach ($invoices as $inv) {
echo $inv->customer->name; // Mengeksekusi query baru di tiap iterasi!
}
// BAIK: Eager Loading (Hanya 2 Query)
$invoices = Invoice::with("customer")->get();