Bayangkan Anda mencari satu istilah di kamus tebal beribu halaman. Kalau kamus itu tidak tersusun rapi dari A sampai Z, Anda terpaksa membuka halaman satu demi satu sampai menemukan kata yang dicari. Untungnya kamus selalu disusun berdasarkan abjad, sehingga Anda bisa langsung menuju bagian yang tepat tanpa membaca seluruh isi buku.
Database menghadapi masalah yang sama persis setiap kali Anda meminta data tertentu dari tabel berisi jutaan baris. Tanpa bantuan apa pun, database harus membaca baris demi baris sampai menemukan data yang cocok — proses yang disebut full table scan. Indexes adalah jawaban database untuk masalah ini: struktur data tambahan yang membuat pencarian data secepat membuka kamus lewat susunan abjadnya, bukan membaca dari halaman pertama.
Perlu diluruskan dulu, istilah "index" dipakai di banyak konteks. Dalam pemrograman, nomor urut elemen larik (array) juga disebut index. Artikel ini fokus pada index sebagai struktur data database — bukan penomoran larik — karena itulah makna yang paling relevan untuk Anda yang sedang bekerja dengan database dan ingin query-nya berjalan lebih cepat.
Apa Itu Index dalam Database?
Index dalam database adalah struktur data terpisah yang menyimpan salinan ringkas dari satu atau beberapa kolom tabel, disusun dalam urutan tertentu supaya cepat dicari. Index dibuat lewat perintah CREATE INDEX dan tersimpan di ruang penyimpanannya sendiri, terpisah dari tabel aslinya.
Konsepnya mirip daftar isi di buku tebal. Daftar isi bukan bagian dari isi buku, tapi ia menunjuk ke halaman tempat suatu topik dibahas. Anda tidak perlu membaca dari halaman pertama; Anda cukup buka daftar isi, cari topiknya, lalu lompat langsung ke halaman yang dimaksud. Index database bekerja dengan logika serupa: ia menyimpan nilai kolom yang diindeks beserta pointer (penunjuk) ke lokasi baris aslinya di tabel.
Tanpa index, database terpaksa melakukan full table scan — membaca seluruh baris satu per satu untuk menemukan data yang cocok dengan query Anda. Untuk tabel berisi ratusan baris, ini mungkin tidak terasa. Namun untuk tabel berisi jutaan baris, full table scan bisa berarti menunggu berdetik-detik hanya untuk satu pencarian sederhana.
Cara Kerja Index: Kenapa Pencarian Jadi Lebih Cepat
Struktur data yang paling umum dipakai untuk index adalah B-tree (pohon seimbang). Hampir semua sistem database — MySQL lewat storage engine InnoDB, PostgreSQL, SQL Server, bahkan database NoSQL seperti MongoDB — memakai B-tree sebagai struktur index bawaan.
Cara kerjanya, B-tree menyusun nilai kolom yang diindeks dalam urutan terurut, bercabang menyerupai pohon dari satu titik akar ke banyak titik daun (leaf node). Setiap leaf node menyimpan nilai kolom beserta pointer ke baris aslinya, dan seluruh leaf node saling terhubung membentuk rangkaian berurutan. Susunan ini membuat dua jenis pencarian sama-sama efisien: mencari nilai persis (misalnya WHERE email = 'user@mail.com') maupun mencari rentang nilai (misalnya WHERE tanggal BETWEEN '2026-01-01' AND '2026-01-31').
Dari sisi kompleksitas komputasi, full table scan rata-rata harus memeriksa setengah dari seluruh baris tabel sebelum menemukan data yang dicari. Index lewat B-tree memangkas itu mendekati logaritma dari jumlah baris — pada tabel berisi 1 juta baris, bedanya bisa berarti ribuan kali pemeriksaan berkurang jadi puluhan langkah saja. Index juga menghemat ruang yang dibaca dari disk karena entrinya jauh lebih ringkas daripada baris tabel lengkap, sehingga lebih banyak entri index muat dalam satu blok baca disk dibanding baris data mentah.
Cara kerja index: tanpa index memeriksa delapan baris satu per satu, index langsung menuju baris ke-8 lewat B-tree.
Clustered vs Non-Clustered Index: Apa Bedanya?
Ada dua cara index disimpan relatif terhadap tabelnya, dan perbedaan ini sering membingungkan pemula.
Clustered index membuat data tabel fisik ikut disusun ulang mengikuti urutan index tersebut. Karena data hanya bisa diurutkan dengan satu cara dalam satu waktu, setiap tabel maksimal punya satu clustered index. Di MySQL dengan storage engine InnoDB dan di SQL Server, primary key tabel otomatis dijadikan clustered index tanpa perlu Anda buat secara manual.
Non-clustered index (disebut juga secondary index) adalah struktur terpisah yang tidak mengubah urutan fisik data. Ia hanya menyimpan nilai kolom yang diindeks beserta pointer menuju lokasi baris aslinya. Satu tabel bisa punya banyak non-clustered index sekaligus, tapi pencariannya butuh satu langkah tambahan dibanding clustered index: setelah menemukan pointer di index, database masih harus melompat ke tabel asli untuk mengambil kolom lain yang tidak ikut diindeks.
Perlu dicatat, PostgreSQL berperilaku berbeda dari MySQL. Primary key di PostgreSQL tidak otomatis menjadi clustered index — semua index tersimpan terpisah dari tabel, kecuali Anda menjalankan perintah CLUSTER secara manual untuk menyusun ulang data fisiknya.
Jenis-Jenis Index yang Umum Digunakan
Selain dibedakan lewat cara penyimpanannya, index juga punya beberapa jenis berdasarkan fungsi dan strukturnya:
- Unique index: memastikan setiap nilai pada kolom yang diindeks tidak boleh duplikat, sekaligus mempercepat pencarian. Index ini otomatis terbentuk saat Anda mendefinisikan constraint
UNIQUEatauPRIMARY KEYpada sebuah kolom. - Composite index (index gabungan): dibuat dari lebih dari satu kolom sekaligus, misalnya
(kota, nama). MySQL mendukung hingga 16 kolom dalam satu composite index. Yang sering terlewat pemula adalah leftmost prefix rule: index gabungan(kota, nama)bisa dipakai untuk query yang memfilterkotasaja ataukotadannamabersamaan, tapi tidak bisa dipakai kalau query hanya memfilternamatanpa menyertakankota. - Full-text index: dirancang untuk pencarian teks natural, bukan pencocokan persis. MySQL menyediakannya lewat tipe
FULLTEXT, sementara PostgreSQL mencapai hal serupa lewat kombinasi index GIN dan tipe datatsvector. - Hash index: hanya efektif untuk pencocokan kesetaraan (
=), dan tidak bisa dipakai untuk pencarian rentang sepertiBETWEENatau>. Di MySQL, hash index hanya tersedia pada storage engineMEMORY. - GIN dan BRIN: dua jenis index khas PostgreSQL. GIN (Generalized Inverted Index) cocok untuk kolom yang menyimpan banyak nilai sekaligus, seperti array atau JSONB. BRIN (Block Range Index) jauh lebih hemat ruang dan cocok untuk kolom yang nilainya berkorelasi dengan urutan fisik baris, misalnya kolom
created_atyang selalu bertambah seiring waktu. - Covering index: index yang kebetulan sudah memuat semua kolom yang diminta sebuah query, sehingga database bisa langsung menjawab query itu dari index saja tanpa perlu membuka tabel aslinya sama sekali.
Index gabungan kolom kota dan nama: query dengan kolom kota bisa memakai index, query hanya kolom nama tidak bisa dipakai.
Kelebihan Menggunakan Index
Manfaat utama index sudah terlihat dari cara kerjanya, tapi ada beberapa keuntungan konkret yang layak disebutkan satu per satu:
- Mempercepat klausa
WHERE,JOIN,ORDER BY, danGROUP BY: keempat operasi ini paling sering memicu full table scan kalau tidak dibantu index, dan paling terasa peningkatannya begitu index terpasang di kolom yang tepat. - Mempercepat pencarian nilai minimum dan maksimum: fungsi seperti
MIN()danMAX()pada kolom yang diindeks bisa langsung membaca ujung struktur B-tree tanpa perlu memeriksa seluruh baris. - Menjaga keunikan data: unique index sekaligus berfungsi sebagai penjaga integritas data, mencegah duplikasi tanpa perlu logika tambahan di sisi aplikasi.
- Covering index menjawab query tanpa menyentuh tabel asli: kalau semua kolom yang diminta sudah ada di index, database bisa langsung menjawabnya dari sana — jauh lebih cepat dibanding masih harus melompat ke tabel.
Kekurangan dan Hal yang Perlu Anda Pertimbangkan
Index bukan solusi tanpa konsekuensi. Ada beberapa hal yang perlu Anda pertimbangkan sebelum menambahkan index ke sebuah tabel:
- Menghabiskan ruang penyimpanan tambahan: index adalah struktur data terpisah, sehingga ia butuh ruang disk sendiri di luar tabel aslinya. Kolom bertipe string biasanya makan ruang lebih besar dibanding kolom angka karena panjangnya bervariasi.
- Memperlambat operasi
INSERT,UPDATE, danDELETE: setiap kali baris ditambah, diubah, atau dihapus, semua index yang menempel di tabel itu juga harus diperbarui, bukan hanya data barisnya. PlanetScale pernah mengukur ini secara langsung: bulk insert 1 juta baris pada tabel tanpa index memakan waktu sekitar 10-15 detik, tapi begitu beberapa index ditambahkan, waktunya melonjak jadi sekitar 2 menit. - Menambah beban query planner: makin banyak index sekunder yang tersedia, makin banyak opsi yang harus dipertimbangkan optimizer database sebelum memutuskan cara tercepat menjalankan sebuah query. Index yang berlebihan justru bisa memperlambat proses ini.
- Kurang berguna pada kolom dengan cardinality rendah: cardinality adalah jumlah nilai unik pada sebuah kolom dibanding total barisnya. Index pada kolom seperti status boolean (aktif/nonaktif) hampir tidak membantu, karena database tetap harus memeriksa banyak baris yang memiliki nilai sama persis.
Karena alasan-alasan ini, menambahkan index ke semua kolom supaya aman justru bisa membuat performa keseluruhan database menurun, terutama pada tabel yang sering ditulis.
Cara Membuat Index di SQL
Perintah dasar untuk membuat index relatif sederhana dan konsisten di berbagai sistem database seperti MySQL dan PostgreSQL. Berikut sintaks untuk index kolom tunggal:
CREATE INDEX idx_email ON pengguna (email);Untuk index gabungan pada lebih dari satu kolom, cukup sebutkan kolom-kolomnya secara berurutan sesuai kebutuhan query Anda:
CREATE INDEX idx_kota_nama ON pengguna (kota, nama);Kalau Anda ingin sekaligus memastikan tidak ada nilai duplikat pada kolom tersebut, gunakan UNIQUE:
CREATE UNIQUE INDEX idx_username ON pengguna (username);Ingat, urutan kolom pada index gabungan menentukan query mana saja yang bisa memanfaatkannya, sesuai leftmost prefix rule yang sudah dibahas sebelumnya. Susun kolom yang paling sering dipakai sebagai filter pertama di posisi paling kiri.
Cara Memeriksa Index Sudah Dipakai atau Belum
Membuat index saja tidak menjamin ia benar-benar dipakai oleh query Anda. Untuk memastikannya, gunakan perintah EXPLAIN sebelum query yang ingin diperiksa:
EXPLAIN SELECT * FROM pengguna WHERE email = 'user@mail.com';Pada MySQL, hasil EXPLAIN menampilkan kolom possible_keys (index yang secara teori bisa dipakai) dan key (index yang benar-benar dipilih query planner database). Kalau kolom key kosong padahal Anda yakin sudah membuat index yang relevan, ada dua kemungkinan penyebab paling umum: tipe data kolom yang dibandingkan tidak cocok, atau query melanggar leftmost prefix rule pada index gabungan.
Anda juga bisa melihat daftar lengkap index yang sudah dibuat pada sebuah tabel dengan:
SHOW INDEX FROM pengguna;Kebiasaan memeriksa EXPLAIN sebelum dan sesudah menambahkan index akan menghindarkan Anda dari index yang ternyata tidak pernah terpakai — hanya menghabiskan ruang dan memperlambat penulisan data tanpa memberi manfaat apa pun.
Kapan Sebaiknya Anda Menambahkan Index?
Setelah memahami kelebihan dan kekurangannya, berikut panduan konkret kapan index layak ditambahkan:
- Kolom yang sering muncul di
WHERE,JOIN, atauORDER BY: ini kandidat paling jelas. Kalau sebuah kolom terus-menerus dipakai untuk memfilter atau mengurutkan hasil query, index di kolom itu hampir selalu memberi manfaat. - Kolom dengan cardinality tinggi: prioritaskan kolom yang nilainya sangat bervariasi, seperti email, nomor identitas, atau kode transaksi, dibanding kolom dengan sedikit variasi nilai seperti status boolean.
- Tabel yang lebih banyak dibaca daripada ditulis: index paling menguntungkan pada tabel dengan rasio baca jauh lebih tinggi dibanding tulis. Sebaliknya, tabel log atau tabel antrian yang menerima ribuan
INSERTper detik justru bisa terbebani kalau terlalu banyak index menempel padanya. - Hindari index pada tabel kecil: untuk tabel berisi hanya puluhan atau ratusan baris, full table scan biasanya sudah cukup cepat. Menambahkan index di sini menambah kompleksitas tanpa manfaat nyata.
Sebagai kebiasaan kerja, tambahkan index satu per satu, ukur dampaknya lewat EXPLAIN atau waktu eksekusi query, lalu evaluasi lagi kalau ada index yang ternyata jarang terpakai.
Kesimpulan
Indexes adalah struktur data yang membuat database tidak perlu membaca seluruh baris tabel setiap kali Anda mencari data tertentu — mirip cara daftar isi buku membantu Anda melompat langsung ke halaman yang dicari. Lewat struktur B-tree, index mengubah pencarian yang tadinya harus memeriksa ratusan ribu baris menjadi hanya belasan langkah saja.
Namun index bukan sesuatu yang bisa ditambahkan sembarangan ke semua kolom. Setiap index menambah beban penyimpanan dan memperlambat operasi tulis, sehingga keputusan menambahkannya sebaiknya didasarkan pada pola query yang benar-benar sering dijalankan, bukan sekadar berjaga-jaga. Semoga artikel ini membantu.




