Lewati ke konten utama
menjadi.dev
Chapter 25.3 Database Lanjutan

Query Optimization dan Execution Plan

Tulis query yang efisien dan pahami cara database mengeksekusinya

Tujuan Pembelajaran

  • Bisa membaca dan menginterpretasi EXPLAIN output
  • Mengerti common query anti-patterns
  • Bisa menulis efficient joins dan subqueries

Analogi

Diagram

      Query Optimization:
├── EXPLAIN ANALYZE -> Lihat execution plan
├── Avoid SELECT * -> Hanya ambil yang perlu
├── Proper JOIN types -> INNER, LEFT, SEMI
├── Batch operations -> Bulk insert, UPDATE dengan JOIN
└── CTE vs Subquery -> Pilih yang lebih readable dan cepat
    

Query yang lambat bisa memperlambat seluruh aplikasi — optimization adalah skill backend wajib

Penjelasan Konsep

Satu query yang lambat bisa memperlambat seluruh aplikasi. Mari pelajari cara menulis query yang efisien dan mengidentifikasi bottleneck.

EXPLAIN ANALYZE

Perintah paling penting untuk query optimization. Menunjukkan execution plan, cost estimation, actual execution time, dan row count.

Common Anti-Patterns

SELECT * (ambil semua columns padahal hanya butuh beberapa — lebih lambat, lebih banyak memory). N+1 Query (fetch list lalu fetch detail satu per satu di loop — 101 queries untuk 100 items!).

Missing LIMIT (SELECT tanpa LIMIT bisa mengembalikan jutaan row).

Functions on indexed columns (WHERE LOWER(email) = ‘a@b.com’ — function membuat index tidak usable kecuali expression index).

Efficient Joins

INNER JOIN (hanya row yang match),

LEFT JOIN (semua row dari kiri, null kalau tidak match), EXISTS/NOT EXISTS (lebih efisien daripada IN/NOT IN untuk subquery).

Batch Operations

Lakukan operasi dalam batch, bukan satu per satu.

Inti yang Perlu Dipahami

Bagian ini berfokus pada bisa membaca dan menginterpretasi EXPLAIN output., mengerti common query anti-patterns., dan bisa menulis efficient joins dan subqueries. Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.

Saat membaca Query Optimization dan Execution Plan, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.

Cara Membayangkannya

Query yang lambat bisa memperlambat seluruh aplikasi — optimization adalah skill backend wajib. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.

Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.

Saat Melihat Contoh Kode

Contoh kode pada chapter ini memakai bahasa sql. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal. Keyset pagination menggunakan WHERE + LIMIT — jauh lebih cepat daripada OFFSET untuk page besar. CTE membuat query kompleks lebih readable.

Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.

Konteks dalam Perjalanan Belajar

Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.

Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.

Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.

Contoh Kode

sql
-- N+1 Problem Solution: JOIN
SELECT p.title, u.name AS author_name,
       COUNT(c.id) AS comment_count
FROM posts p
INNER JOIN users u ON p.user_id = u.id
LEFT JOIN comments c ON c.post_id = p.id
WHERE p.published_at IS NOT NULL
GROUP BY p.id, u.name
ORDER BY p.published_at DESC
LIMIT 20;

-- Efficient pagination dengan keyset (cursor-based)
-- ❌ OFFSET lambat untuk page besar
SELECT * FROM posts ORDER BY id LIMIT 10 OFFSET 100000;

-- ✅ Keyset pagination (WHERE + LIMIT)
SELECT * FROM posts
WHERE id < :last_seen_id
ORDER BY id DESC
LIMIT 10;

-- CTE untuk query kompleks yang readable
WITH published_stats AS (
  SELECT category_id, COUNT(*) AS post_count,
         MAX(published_at) AS latest_post
  FROM posts WHERE published_at IS NOT NULL
  GROUP BY category_id
)
SELECT c.name, COALESCE(ps.post_count, 0) AS posts, ps.latest_post
FROM categories c
LEFT JOIN published_stats ps ON ps.category_id = c.id
ORDER BY ps.post_count DESC;

Penjelasan Kode

Keyset pagination menggunakan WHERE + LIMIT — jauh lebih cepat daripada OFFSET untuk page besar. CTE membuat query kompleks lebih readable.

Prompt AI

Identifikasi N+1 queries di aplikasimu. Refactor menjadi JOIN atau batch query. Ukur perbedaan performa.

Pertanyaan Reflektif

Rule of thumb: query yang lambat > 100ms untuk user-facing endpoint perlu dioptimasi.