Database Indexing: Kenapa Query Lambat dan Cara Mempercepatinya
Kenapa Query Bisa Sangat Lambat?
Tanpa index, database harus membaca setiap baris dalam tabel untuk menemukan data yang dicari (disebut full table scan). Untuk tabel dengan jutaan baris, ini bisa memakan waktu beberapa detik — bahkan menit.
Apa Itu Index Database?
Index adalah struktur data terpisah (biasanya B-Tree) yang menyimpan nilai kolom tertentu beserta pointer ke baris aslinya — mirip indeks di belakang buku. Database bisa mencari index jauh lebih cepat daripada scan seluruh tabel.
Membuat Index di MySQL/PostgreSQL
-- Index single kolom
CREATE INDEX idx_users_email ON users (email);
-- Index komposit (urutan kolom penting!)
CREATE INDEX idx_posts_status_created ON blog_posts (status, created_at);
-- Lihat index yang ada
SHOW INDEX FROM blog_posts; -- MySQL
d blog_posts -- PostgreSQL
Cara Analisis Query dengan EXPLAIN
EXPLAIN SELECT * FROM blog_posts
WHERE status = "published"
AND created_at > "2025-01-01"
ORDER BY created_at DESC;
Perhatikan kolom type: ALL berarti full scan (buruk), ref atau range berarti index digunakan (bagus).
Aturan Index Komposit: Leftmost Prefix
Index (status, created_at) dapat digunakan oleh query yang filter status saja, atau status + created_at bersama — tapi TIDAK untuk created_at saja.
Kapan JANGAN Buat Index
- Kolom yang jarang dipakai di WHERE, JOIN, atau ORDER BY.
- Tabel kecil (di bawah beberapa ribu baris) — full scan sudah cukup cepat.
- Kolom yang sering diupdate — setiap UPDATE juga harus memperbarui index, yang menambah overhead write.
Kesimpulan
Index yang tepat bisa mengubah query 5 detik menjadi 10 milidetik. Gunakan EXPLAIN untuk mengidentifikasi masalah, buat index pada kolom yang sering difilter, dan monitor ukuran index agar tidak berlebihan.