#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:
// 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.



