Index: Rahasia Query Cepat di Tabel Besar
Memahami cara kerja index seperti daftar isi buku, membuat index tunggal, unik, dan gabungan, membaca EXPLAIN, serta kapan index justru merugikan.
Cerita: mencari satu nama di buku telepon
Ada buku telepon setebal 5.000 halaman. Kalau namanya tidak diurutkan, kamu harus membuka halaman satu per satu dari awal: lambat. Karena diurutkan abjad, kamu bisa melompat langsung ke huruf yang tepat. Index di database bekerja persis begitu.
Tanpa index, query WHERE pelanggan_id = 5 di tabel berisi 10 juta pesanan harus memeriksa setiap baris (full table scan). Dengan index pada kolom itu, MySQL melompat langsung ke baris yang dicari, dari jutaan langkah menjadi beberapa langkah saja.
Membuat index
-- index biasa: mempercepat pencarian
CREATE INDEX idx_pesanan_pelanggan ON pesanan (pelanggan_id);
-- index UNIQUE: mempercepat sekaligus melarang nilai kembar
CREATE UNIQUE INDEX uq_pelanggan_email ON pelanggan (email);
-- index gabungan: untuk query yang memakai dua kolom bersamaan
CREATE INDEX idx_produk_kategori_harga ON produk (kategori_id, harga);
-- melihat index
SHOW INDEX FROM pesanan;
-- menghapus index
DROP INDEX idx_pesanan_pelanggan ON pesanan;
PRIMARY KEY dan UNIQUE otomatis punya index. FOREIGN KEY di MySQL (InnoDB) juga otomatis dibuatkan index pada kolomnya.
Membuktikan dengan EXPLAIN
Tulis EXPLAIN di depan SELECT untuk melihat rencana eksekusi tanpa menjalankannya:
EXPLAIN SELECT * FROM pesanan WHERE pelanggan_id = 5;
tanpa index: type = ALL rows = 1.000.000 ← memeriksa semua baris
dengan index: type = ref rows = 4 ← langsung ke baris yang tepat
key = idx_pesanan_pelanggan
Cari kolom type: ALL = pemindaian penuh (biasanya buruk di tabel besar); ref/range/const = memakai index (bagus). Kolom key menunjukkan index yang dipilih.
Aturan index gabungan: urutan kolom penting
Index (kategori_id, harga) seperti buku telepon yang diurutkan berdasarkan kota, lalu nama. Bisa dipakai untuk: WHERE kategori_id = 1 dan WHERE kategori_id = 1 AND harga > 15000. Tapi tidak efektif untuk WHERE harga > 15000 saja (kolom pertama dilewati). Ini disebut aturan leftmost prefix.
Index itu bukan gratis
| Keuntungan | Harga yang dibayar |
|---|---|
| SELECT/WHERE/JOIN/ORDER BY lebih cepat | INSERT, UPDATE, DELETE lebih lambat (index ikut diperbarui) |
| Menjamin keunikan (UNIQUE) | Memakan ruang disk tambahan |
Bukan "semakin banyak index semakin bagus". Pasang index untuk kolom yang sering dipakai di WHERE, JOIN ... ON, dan ORDER BY. Jangan untuk kolom yang jarang dicari atau punya sedikit variasi nilai (misalnya kolom jenis kelamin yang hanya berisi dua nilai), dan hindari menumpuk puluhan index pada satu tabel.
Kebiasaan yang mematikan index
- Membungkus kolom dengan fungsi:
WHERE YEAR(tanggal) = 2024→ ganti dengan rentangtanggal >= '2024-01-01' AND tanggal < '2025-01-01'. - Pola LIKE berawalan wildcard:
LIKE '%kopi'tidak bisa memakai index;LIKE 'kopi%'bisa. - Membandingkan tipe berbeda: kolom teks dibandingkan dengan angka tanpa kutip.