Covering Index di SQL untuk Query Lebih Cepat (2026)
TL;DR
Covering index di SQL adalah index yang udah nyimpen semua kolom yang dibutuhin sebuah query, jadi database bisa jawab tanpa buka tabel utama. Bikinnya dengan naruh kolom pencarian di key index dan kolom lain di klausa INCLUDE. Hasilnya query lebih cepat karena database cukup baca index, sebuah proses yang disebut index-only scan.
Covering index di SQL adalah index yang udah nyimpen semua kolom yang dibutuhin sebuah query, jadi database bisa jawab tanpa buka tabel utama.
Ini salah satu trik paling gampang buat percepat query yang lambat. Kalau semua kolom yang kamu minta udah ada di index, database nggak perlu bolak-balik ke tabel.
Artikel ini jelasin apa itu covering index, cara bikinnya pakai INCLUDE, dan kapan sebaiknya kamu pakai atau nggak.
Apa itu covering index?
Covering index adalah index yang nyimpen semua kolom yang dipakai sebuah query, baik buat nyari maupun buat nampilin hasil. Karena datanya lengkap di index, database bisa jawab query cuma dengan baca index. Langkah balik ke tabel utama yang biasanya mahal jadi hilang.
Istilah teknisnya, database ngelakuin index-only scan. Artinya, dia cukup baca index tanpa nyentuh tabel sama sekali.
Buat paham ini, kamu perlu ngerti dasar index dulu. Singkatnya, index itu struktur terurut yang bikin database cepat nemu baris tanpa ngecek satu per satu.
Gimana cara kerja covering index?
Index biasa cuma nyimpen kolom pencarian. Waktu query butuh kolom lain buat hasil, database nyatet lokasi baris di index, lalu balik ke tabel buat ambil kolom sisanya. Langkah balik ini disebut lookup, dan dia lambat kalau kejadian jutaan kali.
Covering index ngilangin langkah lookup. Semua kolom hasil udah ada di dalam index, jadi database cukup baca sekali.
Anggap kamu punya tabel penjualan dengan kolom tanggal, produk, dan jumlah. Query ini nyari penjualan di satu tanggal:
SELECT produk, jumlah
FROM penjualan
WHERE tanggal = '2026-10-01';
Kalau index cuma di kolom tanggal, database nemu barisnya lewat index, tapi masih harus balik ke tabel buat ambil produk dan jumlah. Covering index nyimpen produk dan jumlah juga, jadi nggak perlu balik.
Cara bikin covering index pakai INCLUDE
Cara paling rapi bikin covering index pakai klausa INCLUDE. Kolom pencarian ditaruh di kunci index, kolom hasil ditaruh di INCLUDE. Kolom INCLUDE ikut kesimpan tapi nggak ngurutin index, jadi kunci index tetap ramping dan cepat.
Bandingin index biasa dan covering index:
-- Index biasa: cuma kolom pencarian
CREATE INDEX idx_penjualan_tanggal
ON penjualan (tanggal);
-- Covering index: tambah kolom hasil di INCLUDE
CREATE INDEX idx_penjualan_covering
ON penjualan (tanggal)
INCLUDE (produk, jumlah);
Dengan index kedua, query tadi bisa dijawab index-only. Kolom tanggal buat nyari, produk dan jumlah buat hasil, semua ada di satu index.
INCLUDE ada di SQL Server dan PostgreSQL versi baru. Di MySQL yang nggak punya INCLUDE, kamu naruh semua kolom di composite index buat efek serupa.
Covering index vs index biasa: bedanya di mana?
Keduanya sama-sama percepat pencarian, tapi covering index nyimpen lebih banyak biar nggak perlu buka tabel. Tabel ini ngerangkum bedanya:
| Aspek | Index biasa | Covering index |
|---|---|---|
| Kolom yang disimpan | Cuma kolom pencarian | Kolom pencarian + kolom hasil |
| Balik ke tabel | Perlu (lookup) | Nggak perlu (index-only) |
| Ukuran index | Lebih kecil | Lebih besar |
| Kecepatan baca | Cepat | Lebih cepat buat query yang cocok |
| Dampak ke tulis | Kecil | Lebih berat |
Gampangnya, covering index lebih cepat buat baca tapi lebih mahal buat nyimpan dan nulis. Cocok buat query yang sering dijalanin dan cuma butuh sedikit kolom.
Contoh Kasus: laporan harian toko_berkah
Anggap toko_berkah punya tabel penjualan dengan 2 juta baris transaksi setahun. Tiap pagi, sistem jalanin query buat rekap produk dan jumlah per tanggal. Query ini kepanggil ratusan kali sehari.
Dengan index biasa di tanggal, database nemu baris cepat tapi masih lookup ke tabel buat tiap produk dan jumlah. Di tabel 2 juta baris, lookup ini yang bikin query berat.
Setelah dikasih covering index dengan INCLUDE (produk, jumlah), query jadi index-only. Dari yang aku lihat di kasus tabel sebesar itu, waktu query rekap harian bisa turun dari sekitar 800 milidetik ke bawah 100 milidetik. Beban ke server juga berkurang karena tabel utama nggak kesentuh.
Kalau kamu mau ngatur urutan kolom di kunci index dengan bener, baca composite index dan urutan kolom.
Kapan Nggak Perlu Covering Index
Covering index bukan solusi buat semua query. Beberapa kondisi di mana dia malah bikin rugi:
- Query ambil banyak kolom. Kalau query butuh 10 kolom, naruh semuanya di index bikin ukurannya meledak.
- Tabel sering di-update. Tiap INSERT dan UPDATE harus perbarui index juga. Makin gemuk index, makin lambat tulisnya.
- Query jarang dipakai. Bikin index khusus buat query yang setahun sekali jalan itu mubazir.
- Storage terbatas. Covering index makan ruang lebih. Di database kecil, ini kadang nggak sepadan.
Aturan praktisnya, pakai covering index buat query yang sering dijalanin, cuma minta sedikit kolom, dan di tabel yang lebih banyak dibaca daripada ditulis.
FAQ
Pertanyaan yang sering muncul soal covering index.
Penutup
Covering index bikin query cepat dengan nyimpen semua kolom yang dibutuhin, jadi database nggak perlu buka tabel utama. Kuncinya klausa INCLUDE buat naruh kolom hasil tanpa nggembungin kunci index.
Inget dua hal: covering index enak buat query baca yang sering dan ramping, tapi berat buat tabel yang banyak ditulis.
Lanjut pahami cara nyusun kunci index yang bener di composite index, dan cek detail index-only scan di dokumentasi PostgreSQL. Latihan query-nya bisa kamu coba langsung di NgulikSQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)
NTH_VALUE ngambil nilai baris ke-N dalam window, tapi frame default-nya sering bikin hasil NULL. Ini sintaksnya, cara benerin frame, plus contoh transaksi toko.
Running Max dan Min dengan Window Function SQL
Lacak nilai tertinggi dan terendah berjalan di SQL pakai window function MAX dan MIN OVER. Ini sintaks, frame clause, dan contoh rekor omzet toko.
Analisa Afinitas Produk (Cross-Sell) dengan SQL
Produk apa yang sering dibeli bareng? Analisa afinitas produk pakai SQL self JOIN jawab itu. Ini cara hitung support, confidence, dan lift buat strategi cross-sell.