Performa Query di Laravel: Analisis Kasus Penggunaan Query Builder dan Eloquent ORM


Dalam dunia pengembangan web yang dinamis, memilih teknologi yang tepat untuk mengakses dan mengelola data bisa sangat menentukan performa aplikasi. Laravel, sebagai salah satu framework PHP yang populer, menawarkan dua cara kuat untuk berinteraksi dengan database: Query Builder dan Eloquent ORM. Keduanya memiliki keunggulan dan kegunaannya masing-masing, tetapi bagaimana pengaruhnya terhadap performa aplikasi? Dalam artikel ini, akan dibahas perbandingan antara Query Builder dan Eloquent ORM, menganalisis bagaimana masing-masing mempengaruhi kecepatan dan efisiensi query dalam berbagai skenario penggunaan. Dari pengambilan data sederhana hingga operasi database yang cukup kompleks. Dari kedua cara mana yang lebih efektif dalam kondisi tertentu dan bagaimana pengembang dapat memanfaatkannya untuk meningkatkan performa aplikasi Laravel mereka.

Performa query dapat dilihat oleh berbagai faktor. Sebagai contohnya pada kali ini faktor yang akan dianalisis adalah jumlah query yang dijalankan, waktu eksekusi dari setiap query, dan duplikasi query yang mungkin terjadi. Untuk menganalisis beberapa faktor yang disebutkan tadi, perlu penggunaan bantuan package laravel yang dikhususkan untuk men debug performa aplikasi. Contoh package laravel yang digunakan untuk men debug adalah Laravel debugbar dan Laravel Telescope. Laravel debugbar adalah package yang sangat berguna untuk pengembangan aplikasi web dengan menggunakan framework Laravel. Laravel Debugbar diintegrasikan ke dalam bar aplikasi web dan menyediakan berbagai informasi yang berguna untuk debugging dan optimisasi aplikasi. Package ini menampilkan data seperti queries database, waktu eksekusi aplikasi, data yang dikirim melalui POST, cookies yang digunakan, dan informasi session, serta banyak lagi. Ini membantu developer untuk memahami apa yang terjadi “di balik layar” pada aplikasi mereka. Sedangkan, Laravel Telescope adalah alat pengembangan yang kuat untuk aplikasi Laravel. Ini adalah alat debug yang hebat yang membantu memantau dan menganalisis apa yang terjadi di dalam aplikasi Laravel saat ini. Kedua package ini memiliki keunggulan masing-masing yang berguna dalam berbagai macam kasus.

Penggunaan Laravel Debugbar

Sebelum melakukan analisa, pastikan project laravel sudah selesai terbuat. Selanjutnya adalah melakukan instalasi laravel debugbar. Gunakan perintah ini untuk menginstalnya:

composer require barryvdh/laravel-debugbar –dev

pada bar tersebut memiliki beberapa tab yang penting. Salah satunya tab Queries yang memberikan informasi mengenai query yang dijalankan saat memuat halaman tertentu.

Project laravel yang akan dijadikan contoh sebagai analisa query adalah halaman artikel sederhana. Pada halaman tersebut ditampilkan seluruh artikel dengan nama penulisnya. Oleh karena itu setidaknya pada project laravel ini memiliki 2 table (users dan posts). Dimana kedua table in memiliki relasi untuk one-to-many.

Analisis pertama adalah menampilkan seluruh artikel tanpa penulisnya. Artinya, query yang dipakai hanya untuk mengakses 1 table terlebih dahulu. Query builder dan eloquent ORM masing masing akan digunakan lalu akan dianalisis informasi yang muncul pada laravel debugbar. Pada kasus ini terdapat 10 users dan setiap users memiliki 10 artikel.

Berikut adalah tampilan dengan menggunakan query builder:

query yang digunakan adalah sebagai berikut:
DB::table(‘posts’)->get();

Berikut adalah tampilan dengan menggunakan eloquent ORM:

query yang digunakan adalah sebagai berikut:
Post::all();

Dari kedua hasil tersebut dapat dianalisis bentuk raw query apa yang dijalankan. Waktu yang digunakan untuk menjalankan querynya juga dapat diketahui dibagian kanan laravel debugbar. Pada studi kasus ini tidak banyak perbedaan antara penggunaan query builder dan eloquent ORM. Raw query yang dijalankan juga sama dan perbedaan waktu running sangat mirip yaitu hanya sekitar 5ms.

Selanjutnya adalah menampilkan seluruh artikel dengan penulisnya. Pada kasus ini query yang dipakai untuk mengakses table users dan posts dengan relasi one-to-many. 

Berikut adalah tampilan dengan menggunakan query builder:

query yang digunakan adalah sebagai berikut:
DB::table(‘posts’)->join(‘users’, ‘posts.user_id’, ‘=’, ‘users.id’)->get();

Berikut adalah tampilan dengan menggunakan eloquent ORM:

query yang digunakan adalah sebagai berikut:
Post::all();

Pada kasus ini, query yang didapat menggunakan query builder jauh lebih sedikit dari query yang didapat dari eloquent ORM. Query yang didapat dari query builder hanya 1 yaitu select * from `posts` inner join `users` on `posts`.`user_id` = `users`.`id`. Jauh berbeda dengan menggunakan eloquent ORM. Jika menggunakan eloquent ORM, query yang dijalankan sangat banyak hingga 101 query. Pada list query yang dijalankan juga terdapat banyak query yang duplikat yaitu 99 query. Perbedaan waktu yang digunakan untuk menjalankan query juga sangat berbeda. Query builder hanya membutuhkan sekitar 21ms sedangkan eloquent ORM membutuhkan sekitar 83ms. Duplikasi query yang muncul disebut dengan masalah N+1 query. Ini terjadi saat setiap objek dari set data utama memerlukan query tambahan untuk mengambil data relasinya.

Pada tahap ini dapat diketahui bahwa ketika melakukan select query yang hanya mengakses 1 table saja, performa query builder dan eloquent ORM tidak berbeda jauh. Namun hal ini akan berbeda jauh ketika mengakses data dari lebih 1 table atau data yang memiliki relasi. Tanpa penanganan lebih lanjut, penggunaan eloquent ORM akan menimbulkan masalah N+1 query sehingga query yang dijalankan memiliki duplikasi yang juga berpengaruh pada running time query tersebut. 

Meskipun begitu, penggunaan eloquent ORM bukan berarti buruk untuk mengakses data yang berelasi. Perlu adanya penanganan lebih lanjut untuk mengatasi masalah N+1 query. Diperlukan penggunaan eager loading dengan method ‘with()’ untuk mengatasi permasalahan ini. 

Berikut tampilan menggunakan eloquent ORM dengan eager loading:

query yang digunakan adalah sebagai berikut:

Post::with(‘user’)->get();

penggunaan method with() berguna untuk mengatasi masalah N+1 query. Argument ‘user’ berasal dari nama relasi yang didefinisikan di model Post. Dengan begini query yang dijalankan lebih sedikit dan tidak ada lagi duplikasi query. Waktu yang diperlukan juga jauh lebih sedikit.

Penggunaan Laravel Telescope

Laravel Telescope merupakan salah satu package resmi dari laravel yang digunakan untuk melakukan debug pada aplikasi laravel. Package ini mirip dengan Laravel debugbar, namun ada beberapa fitur yang lebih banyak. Pada Laravel Telescope tampilannya berupa halaman penuh yang bisa digunakan untuk menganalisis setiap request yang terjadi pada aplikasi laravel.

Analisis yang bisa didapatkan mulai dari query apa saja yang dijalankan, running time setiap query dan lainnya. Perbedaan utama yang paling menonjol dari Laravel Debugbar adalah pada laravel debugbar tidak bisa melakukan analisis page API yang tidak memiliki view, sedangkan pada Laravel Telescope tidak mengalami kendala karena semua request termasuk request ke page API dapat dianalisis.

Instalasi Laravel Telescope bisa dilakukan dengan menjalankan perintah:
composer require laravel/telescope

Selanjutnya jalankan perintah:

php artisan telescope:install

php artisan migrate

Setelah semuanya selesai, halaman Laravel Telescope dengan mengakses route /telescope.

Untuk memudahkan analisis, buka tab baru pada browser untuk mengakses halaman lain sehingga nantinya pada tab Laravel Telescope akan otomatis muncul list request apa saja yang masuk.

Sebagai contohnya saat melakukan akses ke halaman API yang sudah dibuat maka list requestnya juga akan bertambah. Klik pada tanda panah di bagian kanan baris tertentu untuk melihat detailnya.

Pada percobaan diatas saat mengakses route /api/posts maka pada list request akan muncul data request baru. Selanjutnya jika di klik tanda panah maka akan menampilkan detail requestnya. Pada Laravel Telescope juga terdapat fitur yang dapat mengetahui waktu jalannya setiap query, query apa saja yang dilakukan, dan lainnya. Pada contoh diatas query pembuatan API menggunakan eloquent ORM dengan method with() sehingga tidak terjadi masalah N+1. Hal ini dibuktikan tidak ada query yang duplikat pada tampilan halaman Laravel Telescope.

Referensi Penelitian Query Laravel

Berdasarkan penelitian yang dilakukan oleh Ishaq Jound dan Hamed Halimi dari Blekinge Institute of Technology dengan judul Comparison of performance between Raw SQL and Eloquent ORM in Laravel (2016), hasil yang didapatkan adalah penggunaan eloquent ORM memiliki waktu yang lebih lama dari raw query. 

Salah satu skenario yang dilakukan adalah melakukan select dengan 3 kali iterasi.

  • Pada iterasi pertama, artikel dipilih dari 2 tabel: memilih 3000 artikel yang diposting oleh seorang pengguna dan batasnya ditetapkan menjadi 3000 artikel.
  • Pada iterasi kedua, artikel dipilih dari 4 tabel: memilih 3000 artikel dengan tag “sport” yang diposting oleh pengguna.
  • Pada iterasi ketiga, artikel dipilih dari 5 tabel: memilih 3000 artikel dengan tag “musik” dan dengan 3000 komentar dengan kolom timestamp “created” yang lebih besar dari 2015-05-21 22:00:00.

berikut perbandingan hasilnya:

Raw SQL:

Eloquent ORM:

Tabel-tabel di atas menunjukkan rata-rata waktu respons untuk setiap join dalam Eloquent ORM dan Raw SQL. Tabel-tabel tersebut menunjukkan bahwa waktu respons rata-rata untuk kedua teknik tersebut meningkat dengan bertambahnya jumlah join dalam setiap tes. Jika membandingkan waktu respons rata-rata di kedua tabel tersebut, dapat dengan jelas melihat bahwa Raw SQL memiliki performa lebih baik daripada Eloquent ORM dalam setiap tes. Pada tes pertama dengan 1 join, Raw SQL membutuhkan 45,8 milidetik lebih cepat daripada Eloquent ORM. Pada tes kedua, terdapat perbedaan 872,1 milidetik, dan pada tes ketiga, terdapat perbedaan 1384,8 milidetik.

Meskipun Eloquent ORM memudahkan pengembang untuk bekerja dengan hubungan tabel dengan mendefinisikan hubungan antara tabel database sebagai fungsi dalam model-model dan mengakses data dari tabel-tabel yang berbeda dengan hanya memanggil satu fungsi pada model yang dipilih, namun ini juga mempengaruhi kinerja aplikasi.

Sumber:

https://github.com/barryvdh/laravel-debugbar

https://laravel.com/docs/11.x/telescope

https://www.diva-portal.org/smash/record.jsf?pid=diva2%3A1014983&dswid=-7532

Ditulis oleh Backend Developer Intern at Digital Amoeba MSIB Batch 6
Afif Rohul Abrori – Universitas Jember (linkedin.com/in/afifrohul)