N+1 Query merupakan permasalahan kinerja yang terkait dengan kueri database, terutama saat menggunakan kerangka kerja ORM (Object-Relational Mapping).
Masalah ini berasal ketika halaman terdapat satu kueri basis data untuk mendapatkan daftar N data. Kemudian N data tersebut diulang dan di dalam loop tersebut mengeksekusi kueri untuk mendapatkan informasi terkait.
Hal tersebut menyebabkan N kueri yang dilakukan di dalam loop di atas satu kueri untuk mendapatkan data, sehingga mengarah ke kueri N+1.
Saya akan memberikan contoh kasus N+1 Query Problem supaya lebih mudah dipahami.
Contoh Kasus
Bayangkan kitak mempunyai sebuah halaman yang di dalamnya terdapat banyak data artikel dan setiap artikel mencantumkan judul dan nama penulisnya. Kemudian bayangkan juga pada aplikasi ini memiliki database dengan 2 tabel yaitu artikel dan penulis.
Berikut contoh implementasi kodingannya.
// Fetch data artikel const articles = await Article.findAll(); // Loop data artikel untuk mengambil data penulis for (const article of articles) { const author = await article.getAuthors() console.log(`Author: ${author.name}, Article: ${article.title}`); }
Pada contoh di atas, jika terdapat 5 artikel, maka ORM akan mengeksekusi satu kueri untuk mengambil semua data artikel dan kemudian mengeksekusi kueri tambahan setiap artikel untuk mengambil data penulis yang terkait. Oleh karena itu, maka total 6 kueri yang dijalankan (1+5) untuk mengambil data.
Cara diatas jelas sangat buruk, Bayangkan jika kalian mempunyai 500 artikel, maka total kueri yang dijalankan yaitu 501. Sehingga dapat memperlambat kecepatan memuat halaman.
Solusi Mengatasi N + 1 Problem
Untuk mengatasi permasalahan kueri N+1, kalian dapat menggunakan eager loading, Eager loading dapat mengambil semua data artikel dan penulis yang terkait dengan cara yang lebih efisien, biasanya hanya menggunakan satu kueri.
// Fetch semua artikel beserta penulis yang terkait const articles = await Article.findAll({ include: 'authors' }); for (const article of article) { const author = article.authors; console.log(`Author: ${author.name}, Article: ${article.title}`); }
Dalam contoh diatas eager loading digunakan untuk menentukan penyertaan data ‘auhtor’ saat mengambil data artikel. Hal ini memungkinkan ORM untuk mengambil kedua artikel dan penulis terkait dalam satu kueri. Dengan begitu menghilangkan masalah kueri N+1.
Dengan mengoptimalkan pengambilan data menggunakan eager loading. Kalian dapat mengurangi jumlah kueri, sehingga dapat meningkatkan kinerja dan efisiensi aplikasi.
Baca Juga
Kesimpulan
N+1 Query merupakan salah satu masalah kinerja pada aplikasi, adapun solusi untuk mengatasinya dengan menggunakan eager loading.
Eager loading dapat mengambil data utama dan data yang terkait dalam satu kueri, sehingga mengurangi loop saat pengambilan data pada database.
Dengan mengoptimalkan pengambilan data dan meminimalkan kueri database yang tidak perlu, Maka anda dapat mengurangi masalah kueri N+1 dan meningkatkan kinerja pada aplikasi anda.