Composite Index di SQL: Cara Kerja dan Urutan Kolom
TL;DR
Composite index adalah index yang dibuat atas dua kolom atau lebih sekaligus. Urutan kolom penting karena database cuma bisa manfaatin index dari kolom paling kiri secara berurutan, yang disebut leftmost prefix rule. Index atas (kota, tanggal) mempercepat filter kota saja, tapi nggak buat filter tanggal saja.
Composite index itu index yang dibuat atas dua kolom atau lebih sekaligus. Dia nyimpen kolom-kolom itu dalam urutan tersortir bareng, jadi database bisa cari cepat waktu kamu filter kombinasi kolom tersebut.
Yang bikin composite index sering disalahpahami: urutan kolomnya penting banget. Index atas (kota, tanggal) beda perilakunya dari (tanggal, kota).
Aku jelasin cara kerjanya lewat leftmost prefix rule, kenapa urutan kolom nentuin performa, dan kapan sebaiknya dipakai.
Apa itu composite index di SQL?
Composite index adalah index yang mencakup dua kolom atau lebih dalam satu tabel. Database nyimpen gabungan kolom itu dalam struktur terurut, sehingga pencarian yang nyaring kolom-kolom tersebut jadi jauh lebih cepat dibanding scan seluruh tabel.
Kalau kamu belum familiar sama index secara umum, ada penjelasan dasarnya di glossary index SQL. Singkatnya, index itu struktur bantu yang bikin pencarian data lebih cepat.
CREATE INDEX idx_transaksi_kota_tanggal
ON transaksi (kota, tanggal);Gimana cara kerja composite index?
Composite index nyortir data berdasarkan kolom pertama dulu, baru kolom kedua di dalam tiap kelompok kolom pertama. Mirip cara buku telepon disortir: nama belakang dulu, baru nama depan di dalam nama belakang yang sama.
Karena urutannya begitu, database cuma bisa manfaatin index dari kolom paling kiri secara berurutan. Aturan ini namanya leftmost prefix rule.
-- index atas (kota, tanggal)
-- kebantu: filter kota saja
WHERE kota = 'Jakarta'
-- kebantu: filter kota dan tanggal
WHERE kota = 'Jakarta' AND tanggal >= '2026-01-01'
-- TIDAK kebantu: filter tanggal saja
WHERE tanggal >= '2026-01-01'Filter tanggal saja nggak kebantu karena tanggal ada di posisi kedua. Buku telepon nggak ngebantu kamu cari orang cuma dari nama depan.
Gimana urutan kolom mempengaruhi performa?
Urutan kolom nentuin query mana yang kebantu. Taruh kolom yang paling sering dipakai buat filter di posisi paling kiri. Kolom dengan kondisi kesamaan biasanya lebih baik di depan daripada kolom rentang.
| Index | Query kota saja | Query tanggal saja |
|---|---|---|
| (kota, tanggal) | Kebantu | Nggak kebantu |
| (tanggal, kota) | Nggak kebantu | Kebantu |
Kalau query kamu lebih sering nyaring kota, taruh kota di depan. Kalau lebih sering nyaring tanggal, balik urutannya. Nggak ada urutan yang benar buat semua kasus, tergantung pola query yang paling sering jalan.
Kapan pakai composite index?
Pakai composite index kalau kamu sering nyaring atau ngurutin beberapa kolom bareng dalam satu query. Satu composite index buat kombinasi kolom itu umumnya lebih cepat dari dua index terpisah yang masing-masing cuma tau satu kolom.
Tapi jangan bikin index buat tiap kombinasi kolom. Tiap index nambah beban waktu INSERT, UPDATE, dan DELETE, karena index-nya ikut diperbarui. Index juga makan ruang penyimpanan.
Contoh kasus: query transaksi toko_berkah
Toko_berkah punya tabel transaksi 2,1 juta baris dari 15 cabang di berbagai kota. Query paling sering: ambil transaksi satu kota dalam rentang tanggal tertentu buat laporan cabang.
SELECT * FROM transaksi
WHERE kota = 'Bandung'
AND tanggal BETWEEN '2026-09-01' AND '2026-09-30';Tanpa index, query ini scan semua 2,1 juta baris. Setelah bikin composite index atas (kota, tanggal), database langsung loncat ke blok Bandung, terus baca rentang tanggal di dalamnya.
Di pengujianku dengan data segini, waktu query turun dari sekitar 1,8 detik jadi di bawah 50 milidetik. Kuncinya kota ditaruh di depan, karena tiap laporan selalu nyebut kota dulu.
Kesalahan umum soal composite index
- Salah urutan kolom. Naruh kolom yang jarang difilter di depan bikin index nggak kepakai buat query utama.
- Ngarep filter kolom kedua saja kebantu. Leftmost prefix rule bilang nggak bisa. Kalau butuh, bikin index terpisah.
- Bikin terlalu banyak index. Tiap index nambah beban tulis. Fokus ke query yang paling sering jalan.
- Lupa cek dengan EXPLAIN. Selalu cek rencana eksekusi biar tau index-nya beneran kepakai, bukan cuma nebak.
FAQ
Kolom mana yang ditaruh duluan?
Kolom yang paling sering difilter, dan biasanya kondisi kesamaan sebelum kondisi rentang.
Lebih baik composite atau dua index terpisah?
Kalau sering nyaring dua kolom bareng, satu composite index umumnya lebih cepat.
Composite index nglambatin nulis?
Sedikit, karena index ikut diperbarui tiap tulis. Tetap layak buat tabel yang sering dibaca.
Lanjut belajar
Ringkasnya: composite index mencakup beberapa kolom, urutan kolomnya nentuin query mana yang kebantu lewat leftmost prefix rule, dan taruh kolom yang paling sering difilter di depan.
Mau ngerti dasar index dulu sebelum yang composite? Baca cara kerja index di SQL. Buat detail teknis multicolumn index, ada di dokumentasi resmi PostgreSQL.
Pengin latihan nulis dan ngeoptimasi query sampai lancar? Coba modul SQL di NgulikSQL dengan dataset yang cukup besar buat berasa bedanya.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Semi Join dan Anti Join di SQL: Filter Pakai Tabel Lain
Semi join ngambil baris yang punya pasangan di tabel lain, anti join ngambil yang nggak punya. Keduanya filter, bukan gabung kolom. Ini cara nulisnya di SQL pakai EXISTS dan NOT EXISTS.
Crosstab (Pivot) di PostgreSQL: Ubah Baris Jadi Kolom
Crosstab di PostgreSQL mivot data dari format panjang (baris) jadi format lebar (kolom), mirip pivot table Excel. Butuh extension tablefunc, dan ada alternatif pakai CASE atau FILTER kalau kolomnya tetap.
INSERT ON CONFLICT di PostgreSQL
INSERT ON CONFLICT bikin PostgreSQL insert baris baru atau update yang udah ada dalam satu perintah, tanpa error gara-gara duplikat primary key.