Index #
Dalam dunia backend dan database, index adalah salah satu senjata utama untuk meningkatkan performa query. Hampir semua engineer pernah mendengar nasihat klasik: “kalau query lambat, coba tambahkan index”. Sayangnya, penggunaan index yang tidak dipahami dengan baik justru sering menjadi sumber masalah baru: write jadi lambat, storage membengkak, bahkan query tetap tidak optimal.
Artikel ini akan membahas apa itu database index, cara kerjanya secara internal, kelebihan dan kekurangannya, serta best practice penggunaan index agar benar-benar membantu performa sistem, bukan malah membebani database.
Apa Itu Database Index? #
Database index adalah struktur data tambahan yang dibuat oleh database untuk mempercepat proses pencarian data pada tabel.
Tanpa index, database harus melakukan full table scan, yaitu membaca seluruh baris data satu per satu untuk menemukan data yang sesuai dengan kondisi query.
Dengan index, database dapat langsung melompat ke lokasi data yang relevan, mirip seperti:
- Daftar isi buku → membantu menemukan halaman tanpa membaca seluruh buku
- Index di kamus → membantu mencari kata dengan cepat
Index tidak menyimpan data utama, melainkan:
- Nilai kolom yang diindex
- Pointer / reference ke baris data asli
Cara Kerja Database Index #
Tanpa Index (Full Table Scan) #
Misalkan ada tabel users dengan 10 juta data:
SELECT * FROM users WHERE email = '[email protected]';
Jika kolom email tidak diindex, database akan:
- Membaca baris pertama
- Mengecek email
- Lanjut ke baris berikutnya
- Terus sampai data ditemukan atau tabel habis
⛔ Ini sangat mahal untuk tabel besar.
Dengan Index #
Jika kolom email diindex:
CREATE INDEX idx_users_email ON users(email);
Database akan:
- Mencari nilai
[email protected]di struktur index - Mendapatkan pointer ke lokasi data
- Mengambil baris data langsung
✅ Jauh lebih cepat dan efisien.
Struktur Data Index (Internal) #
B-Tree (Paling Umum) #
Mayoritas database (MySQL InnoDB, PostgreSQL, Oracle) menggunakan B-Tree atau B+Tree.
Karakteristik:
Data tersimpan terurut
Lookup, insert, delete dalam kompleksitas O(log n)
Sangat efisien untuk:
=><BETWEENORDER BY
Hash Index #
Digunakan pada kondisi tertentu:
- Sangat cepat untuk
= - Tidak bisa digunakan untuk range query
- Tidak mendukung sorting
Biasanya jarang dipakai secara eksplisit.
Full Text Index #
Digunakan untuk pencarian teks:
MATCH AGAINSTto_tsvector(PostgreSQL)
Bukan pengganti B-Tree, tapi solusi untuk use case search.
Jenis-Jenis Index yang Umum #
Single Column Index #
Index pada satu kolom:
CREATE INDEX idx_users_email ON users(email);
Composite Index #
Index pada lebih dari satu kolom:
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
⚠️ Urutan kolom sangat berpengaruh.
Unique Index #
Menjamin tidak ada data duplikat:
CREATE UNIQUE INDEX idx_users_username ON users(username);
Covering Index #
Index yang sudah mencakup semua kolom yang dibutuhkan query, sehingga database tidak perlu membaca tabel utama.
Pros Penggunaan Database Index #
Performa Query Jauh Lebih Cepat #
Terutama untuk:
- SELECT dengan WHERE
- JOIN
- ORDER BY
- GROUP BY
Mengurangi Beban CPU dan IO #
Query lebih cepat → lebih sedikit data dibaca → resource lebih hemat.
Meningkatkan Skalabilitas #
Index yang tepat membuat sistem tetap stabil meskipun data tumbuh besar.
Cons Penggunaan Database Index #
Write Operation Menjadi Lebih Lambat #
Setiap:
- INSERT
- UPDATE
- DELETE
harus:
- Update data utama
- Update semua index terkait
Semakin banyak index → semakin mahal write.
Konsumsi Storage #
Index adalah struktur data tambahan → memakan disk space.
Over Indexing #
Terlalu banyak index bisa menyebabkan:
- Query planner bingung memilih index
- Maintenance index mahal
- Write latency meningkat
Index Tidak Selalu Dipakai #
Index tidak berguna jika:
- Kolom memiliki cardinality rendah (misal boolean)
- Query menggunakan fungsi (
LOWER(col)) - Leading column pada composite index tidak dipakai
Best Practice Penggunaan Database Index #
Index Berdasarkan Query, Bukan Feeling #
Selalu tanyakan:
- Query apa yang paling sering dijalankan?
- Query mana yang paling mahal?
Gunakan:
EXPLAINEXPLAIN ANALYZE
Index Kolom yang Sering Dipakai di WHERE, JOIN, ORDER BY #
Prioritaskan kolom:
- Foreign key
- Filter utama
- Sorting
Perhatikan Cardinality #
Index paling efektif pada kolom dengan nilai unik atau mendekati unik.
Contoh buruk:
is_activegender
Gunakan Composite Index dengan Urutan yang Tepat #
Query:
WHERE user_id = ? AND status = ?
Index yang tepat:
(user_id, status)
Bukan:
(status, user_id)
Hindari Over Indexing #
Setiap index harus bisa menjawab use case query yang jelas.
Jika index tidak pernah dipakai → hapus.
Hati-Hati dengan Function dan Casting #
Query seperti:
WHERE DATE(created_at) = '2025-01-01'
❌ Membuat index tidak terpakai.
Lebih baik:
WHERE created_at >= '2025-01-01'
AND created_at < '2025-01-02'
Monitor dan Review Secara Berkala #
Index bukan sesuatu yang dibuat sekali lalu dilupakan.
Seiring perubahan:
- Query
- Fitur
- Pola akses data
Index juga harus dievaluasi ulang.
Penutup #
Database index adalah alat yang sangat powerful, tetapi seperti pedang bermata dua. Index yang tepat bisa membuat query sangat cepat, namun index yang berlebihan atau salah desain justru memperlambat sistem.
Kunci utamanya:
- Pahami query
- Pahami data
- Gunakan index secara sadar dan terukur
Dengan pendekatan ini, database akan tetap cepat, stabil, dan scalable meskipun data terus bertumbuh.