Masalah N+1 query: penyebab aplikasi melambat saat data bertambah
Masalah N+1 terjadi ketika aplikasi menjalankan satu query untuk mengambil daftar, lalu satu query tambahan untuk setiap barisnya. Daftar 100 data berubah menjadi 101 query. Perbaikannya adalah mengambil data terkait sekaligus lewat join atau eager loading.
Apa itu masalah N+1 query?
Contohnya halaman daftar pesanan yang menampilkan nama pelanggan. Aplikasi mengambil 100 pesanan dengan satu query, lalu mengambil pelanggan satu per satu di dalam perulangan. Hasilnya 1 query ditambah 100 query, atau 101 query.
Pada data kecil dampaknya tidak terasa. Ketika data tumbuh, waktu muat halaman naik sebanding dengan jumlah baris, dan database menjadi kewalahan.
Masalah ini sering tersembunyi di balik ORM. Kode terlihat rapi, misalnya memanggil pelanggan.nama di dalam perulangan, padahal setiap panggilan diam-diam menjalankan query baru ke database.
Bagaimana mendeteksinya?
- Aktifkan log query di lingkungan pengembangan dan cari pola query yang berulang dengan bentuk sama.
- Gunakan alat profiling bawaan framework atau ORM Anda.
- Perhatikan halaman daftar yang melambat seiring bertambahnya data.
- Pasang pemantauan performa di produksi untuk melihat jumlah query per permintaan.
Cek jumlah query per halaman
Halaman daftar yang menjalankan puluhan query hampir pasti punya masalah N+1. Targetkan jumlah query tetap, tidak bergantung pada jumlah baris.
Cara memperbaikinya
Ada tiga pendekatan umum, dan pilihannya bergantung pada kebutuhan datanya.
- Join: ambil data terkait dalam satu query, cocok untuk relasi satu ke satu.
- Eager loading: minta ORM memuat relasi di muka, misalnya lewat opsi include atau with.
- Batch dengan WHERE id IN: kumpulkan semua ID lalu ambil sekali.
- Cache hasil untuk data yang jarang berubah.
Ringkasan dan langkah berikutnya
Periksa halaman daftar paling sering dibuka, hitung jumlah query-nya, lalu perbaiki yang paling banyak.
- Pola: 1 query daftar + N query relasi.
- Contoh: 100 baris menghasilkan 101 query.
- Target: jumlah query konstan per halaman.
- Rujukan: dokumentasi eager loading pada ORM yang Anda pakai.
Topik terkait yang bisa Anda baca berikutnya: indeks database, performa aplikasi saat data membesar, caching Redis, dan monitoring error di produksi.
Kesalahan yang perlu dihindari
Jangan memuat semua relasi secara berlebihan pada setiap query, karena data besar yang tidak dipakai memboroskan memori. Jangan pula mengandalkan cache untuk menutupi N+1 tanpa memperbaiki akar masalahnya.
Pertanyaan singkat seputar topik ini
Apa itu masalah N+1 query?
Aplikasi menjalankan satu query untuk daftar, lalu satu query tambahan untuk setiap barisnya. Daftar 100 baris menghasilkan 101 query.
Bagaimana memperbaikinya?
Gunakan join, eager loading di ORM, atau ambil data terkait sekaligus dengan WHERE id IN, sehingga jumlah query tetap konstan.
Pertanyaan yang sering muncul
Ya, tanpa komitmen. Kami balas dalam 1×24 jam kerja.
Tentang Tim AnabisolutionsStudio digital dari Pekanbaru yang mengerjakan website, aplikasi, dan sistem untuk klien di Riau dan sekitarnya.
Anabisolutions

