BackendNode.jsMySQLSequelize

Panduan Optimasi Query Database MySQL & Sequelize pada Backend Node.js

Mohammad Luqi

Mohammad Luqi

Software Engineer & Fullstack Developer

28 Februari 2026•8 menit•518 baca
Panduan Optimasi Query Database MySQL & Sequelize pada Backend Node.js

#Latar Belakang

Dalam aplikasi skala produksi, 80% hambatan performa (*bottleneck*) REST API bukan berasal dari kecepatan eksekusi kode JavaScript/Node.js, melainkan dari **efisiensi interaksi ke basis data relasional (RDBMS)**.

ORM seperti Sequelize sangat mempercepat waktu development, namun jika digunakan tanpa pemahaman mendalam tentang SQL yang dihasilkan di balik layar, query Anda bisa berakibat fatal pada beban CPU server.


#1. Menghindari Perangkap N+1 Query

Masalah N+1 terjadi ketika kita mengambil daftar data induk (misalnya 50 proyek), lalu di dalam loop melakukan query terpisah untuk mengambil relasi (misalnya kategori atau teknologi):

```javascript // ❌ CONTOH BURUK (N+1 Query) const projects = await Project.findAll(); for (const p of projects) { // Melakukan 50x round-trip query ke MySQL! p.skills = await p.getSkills(); }

// ✅ CONTOH BENAR (Eager Loading dengan JOIN) const projects = await Project.findAll({ include: [ { model: Skill, as: 'skills', attributes: ['id', 'name', 'icon'] } ], order: [['sort_order', 'ASC']] }); ```

Dengan satu instruksi `include`, Sequelize menghasilkan sebuah `LEFT OUTER JOIN` tunggal yang dieksekusi secara instan oleh database engine.


#2. Hanya Ambil Kolom yang Dibutuhkan (Project Attributes)

Sering kali pengembang membiarkan `SELECT *` berjalan secara default. Jika tabel Anda memiliki kolom `content` (teks artikel ribuan karakter) atau log riwayat, pemborosan bandwidth antara server database dan aplikasi akan signifikan:

|javascript
// Batasi hanya kolom yang akan dikirim ke klien
const articles = await Blog.findAll({
  where: { is_published: true },
  attributes: ['id', 'title', 'slug', 'excerpt', 'published_at', 'views_count'],
  limit: 10
});

#3. Strategi Indexing pada Kolom Pencarian & Foreign Key

Pastikan kolom yang sering berada pada klausul `WHERE`, `ORDER BY`, atau `JOIN` memiliki index yang terukur: - Index B-Tree pada kolom slug (`slug`) dan status (`is_published`). - Composite index jika dua kolom sering difilter bersamaan: `CREATE INDEX idx_blog_pub ON Blogs (is_published, published_at DESC);`.


#Ringkasan

Selalu periksa log query mentah (*raw SQL*) yang dieksekusi oleh Sequelize pada lingkungan staging menggunakan `EXPLAIN ANALYZE` di MySQL untuk memastikan indeks database Anda benar-benar terpakai dengan optimal.