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
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
-- 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
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.