Profile Picture About Author - yogaardiana
PenulisYogaardiana
Publikasi

N+1 Problem Laravel: Pembunuh Performa Website yang Wajib Kamu Tahu (dan Solusinya)

Pernahkah kamu merasa aplikasi Laravel yang kamu buat berjalan sangat cepat di komputer lokal (localhost) saat datanya masih sedikit, tapi tiba-tiba menjadi super lemot begitu di-upload ke server dengan ribuan data?

Jika iya, kemungkinan besar kamu terkena jebakan klasik bernama N+1 Problem Laravel.

Masalah ini adalah "musuh dalam selimut" bagi banyak developer, terutama pemula. Kodenya terlihat benar, tidak ada error, tapi di belakang layar, database kamu sedang menjerit kesakitan.

Mari kita bedah apa itu N+1 Problem, kenapa itu berbahaya, dan bagaimana cara mudah memperbaikinya dengan analogi yang masuk akal.


Apa Itu N+1 Problem?

Secara sederhana, N+1 Problem Laravel adalah masalah efisiensi database yang terjadi ketika kodemu menjalankan query (permintaan data) yang tidak perlu secara berulang-ulang di dalam sebuah looping (perulangan).

Masalah ini biasanya muncul saat kamu menggunakan Eloquent Relationship (relasi antar tabel) dengan cara Lazy Loading (memuat data hanya saat dibutuhkan).

Analogi Sederhana: Membeli Kopi untuk Tim

Bayangkan kamu adalah seorang office boy yang diminta membelikan kopi untuk 10 orang karyawan di kantor.


Cara N+1 (Cara Salah / Lazy Loading):

  1. Kamu keluar kantor, pergi ke kedai kopi, beli 1 gelas untuk karyawan A, lalu balik ke kantor.
  2. Kamu keluar lagi, ke kedai kopi, beli 1 gelas untuk karyawan B, lalu balik lagi.
  3. Kamu ulangi terus sampai karyawan ke-10.

Hasilnya: Kamu bolak-balik sebanyak 11 kali (1 kali terima order + 10 kali jalan). Capek, lambat, dan buang-buang bensin.


Cara Eager Loading (Cara Benar / Solusi):

  1. Kamu catat semua pesanan 10 karyawan.
  2. Kamu pergi ke kedai kopi sekali saja, pesan 10 gelas sekaligus, lalu balik ke kantor.

Hasilnya: Kamu hanya jalan 1 kali. Cepat dan efisien.

Dalam Laravel, "bolak-balik ke kedai kopi" itu adalah Query ke Database. Bayangkan jika ada 1.000 data, berarti aplikasi kamu akan "bolak-balik" 1.001 kali!


Studi Kasus: Contoh Koding

Mari kita lihat contoh nyata dalam kode. Misalkan kita punya dua tabel: Books (Buku) dan Authors (Penulis). Satu penulis bisa punya banyak buku.

Kita ingin menampilkan daftar semua buku beserta nama penulisnya.


1. Kode yang Menyebabkan N+1 Problem

// Controller
$books = Book::all(); // Query 1: Mengambil semua buku

return view('books.index', compact('books'));

// View (Blade)
@foreach($books as $book)
{{-- Masalah terjadi di sini! --}}
<p>{{ $book->title }} oleh {{ $book->author->name }}</p>
@endforeach


Apa yang terjadi di belakang layar?


  1. Laravel menjalankan 1 query untuk mengambil semua buku: SELECT * FROM books;
  2. Kemudian, looping berjalan. Saat kode memanggil $book->author->name, Laravel sadar data penulis belum ada. Jadi, dia menjalankan query lagi untuk setiap buku:
  3. Buku 1: SELECT * FROM authors WHERE id = 1;
  4. Buku 2: SELECT * FROM authors WHERE id = 5;
  5. ... dan seterusnya.


Jika kamu punya 100 buku, maka total query yang terjadi adalah 101 query (1 query buku + 100 query penulis). Inilah yang disebut N+1.


Solusi: Eager Loading

Untuk mengatasi N+1 Problem Laravel, kita harus memberitahu Laravel untuk mengambil data penulis sekalian saat mengambil data buku. Teknik ini disebut Eager Loading.

Kita cukup menggunakan method with().


2. Kode yang Sudah Diperbaiki

// Controller
// Perhatikan penambahan ->with('author')
$books = Book::with('author')->get();

return view('books.index', compact('books'));

Apa yang terjadi sekarang?


Laravel hanya akan menjalankan 2 Query saja, berapapun jumlah bukunya (mau 10, 100, atau 1000 buku):

  1. Query pertama mengambil semua buku: SELECT * FROM books;
  2. Query kedua mengambil semua penulis yang terkait dengan buku-buku tersebut sekaligus: SELECT * FROM authors WHERE id IN (1, 5, 8, ...);

Setelah itu, Laravel menyatukan datanya di memori. Jauh lebih cepat dan hemat sumber daya!


Bagaimana Cara Mendeteksi N+1 Problem?

Seringkali masalah ini tidak kasat mata. Untuk melihatnya, kamu butuh alat bantu. Alat paling populer dan wajib diinstall oleh pengguna Laravel adalah Laravel Debugbar.

Dengan Laravel Debugbar, kamu bisa melihat tab "Queries". Jika kamu melihat puluhan query yang mirip dan berulang-ulang hanya untuk membuka satu halaman, selamat! Kamu baru saja menemukan N+1 Problem.


Kesimpulan

N+1 Problem Laravel adalah isu performa yang sering terjadi karena kita mengambil data relasi di dalam loop tanpa persiapan.

  1. Masalah: Mengambil data satu per satu (Lazy Loading) = Banyak Query = Lambat.
  2. Solusi: Mengambil data sekaligus di awal (Eager Loading) menggunakan with() = Sedikit Query = Cepat.

Jadi, mulai sekarang, setiap kali kamu menulis kode yang menampilkan data berelasi, ingatlah analogi "membeli kopi" tadi. Jangan biarkan aplikasimu bolak-balik ke database tanpa alasan!


Sumber : https://laravel.com/docs/12.x/eloquent-relationships


Bantu Support Aku :

Instagram : https://www.instagram.com/yogaardianaaa/

Youtube : https://www.youtube.com/@yogaardiana_dev/

Tiktok : https://tiktok.com/@yogaardianaaa

Threads : https://www.threads.com/@yogaardianaaa