Indeks yang Mencakup dan Pemindaian Hanya Indeks
Menyertakan kolom agar kueri tidak perlu menyentuh heap tabel.
Indeks yang Mencakup dan Pemindaian Hanya Indeks adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Mengingat Kembali Pengambilan dari Heap
Sebelumnya Anda mempelajari bahwa B-Tree biasa hanya menyimpan kolom yang diindeks serta penunjuk baris, sehingga setelah indeks menemukan kecocokan, mesin masih harus beralih ke tabel untuk membaca kolom lainnya. Peralihan itu disebut pengambilan dari heap, dan inilah biaya yang dirancang untuk dihilangkan oleh indeks pencakup.
Pewawancara menanyakan indeks pencakup untuk melihat apakah Anda memahami mengapa indeks dapat menjawab kueri sepenuhnya tanpa menyentuh tabel.
Arti "Pencakupan"
Indeks mencakup sebuah kueri ketika setiap kolom yang diperlukan kueri, dalam SELECT, WHERE, ORDER BY, dan GROUP BY, tersedia di dalam indeks itu sendiri.
Jika kondisi ini terpenuhi, mesin hanya membaca indeks dan tidak pernah mengunjungi tabel. PostgreSQL menyebutnya Pemindaian Hanya Indeks; server SQL dan sistem lainnya menyebutnya indeks pencakup. Manfaatnya adalah lebih sedikit pembacaan halaman dan kueri yang lebih cepat.
Contoh: Kueri yang Dicakup
Misalkan sebuah kueri hanya memerlukan customer_id dan order_date. Indeks komposit yang hanya berisi kedua kolom tersebut sudah memuat semua yang diminta kueri, sehingga kueri dapat dijawab hanya dari indeks.
CREATE INDEX idx_orders_cust_date
ON orders (customer_id, order_date);
-- Covered: both selected columns are in the index
SELECT customer_id, order_date
FROM orders
WHERE customer_id = 42;Satu Kolom Tambahan Menghilangkan Pencakupan
Tambahkan kolom yang tidak terdapat dalam indeks, maka pencakupan hilang dan mesin harus mengambil data dari heap untuk mendapatkannya.
Di sini total tidak ada dalam indeks, sehingga meskipun customer_id mengarahkan pencarian, setiap baris yang cocok memicu pengambilan dari heap untuk membaca total.
-- NOT covered: total is not in the index, forces heap fetches
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;Klausa INCLUDE
Anda dapat menambahkan total sebagai kolom kunci keempat, tetapi jika Anda tidak pernah memfilter atau mengurutkan berdasarkan kolom tersebut, hal itu memboroskan ruang dalam urutan pengurutan pohon. Alat yang lebih rapi adalah INCLUDE (didukung oleh PostgreSQL dan server SQL): alat ini menyimpan kolom tambahan hanya pada daun indeks, sebagai muatan, bukan sebagai bagian dari kunci pengurutan.
Sekarang kueri tercakup tanpa memperbesar bagian indeks yang dapat dicari.
CREATE INDEX idx_orders_cust_date_inc
ON orders (customer_id, order_date)
INCLUDE (total);
-- Now covered: total is carried in the leaf
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;Kolom Kunci vs Kolom yang Disertakan
Pembedaan yang tepat dan mengesankan pewawancara:
- Kolom kunci menentukan urutan pengurutan dan dapat digunakan untuk pencarian langsung dan pemindaian rentang. Kolom ini mengikuti aturan prefiks paling kiri.
- Kolom yang disertakan hanya disimpan pada daun sebagai data tambahan; kolom ini tidak dapat dicari, tetapi memungkinkan indeks mencakup lebih banyak kueri.
Aturan praktis: kolom yang Anda gunakan untuk memfilter atau mengurutkan dimasukkan ke kunci; kolom yang hanya Anda kembalikan dimasukkan ke INCLUDE.
MySQL/InnoDB: Kekhasan Terklaster
Tunjukkan pemahaman lintas dialek. Tabel InnoDB (MySQL) dikelompokkan berdasarkan kunci utama: indeks sekunder secara implisit membawa kolom-kolom kunci utama. Jadi, indeks sekunder otomatis mencakup kueri apa pun yang hanya memilih kolom terindeks dan kolom kunci utama; tidak diperlukan klausa INCLUDE (MySQL tidak memiliki INCLUDE).
Konsep pencakupan bersifat universal; sintaks dan kolom bawaan yang ikut serta berbeda menurut mesin.
Memverifikasi Pemindaian Hanya Indeks
Buktikan pencakupan dengan EXPLAIN. Dalam PostgreSQL, simpul rencana membaca Pemindaian Hanya Indeks, bukan Index Scan. Perhatikan Heap Fetches: 0 dalam EXPLAIN (ANALYZE); itulah tanda pasti bahwa tidak terjadi akses ke tabel.
Jika Anda mengharapkan pemindaian hanya indeks tetapi melihat Index Scan dengan pengambilan dari heap, berarti ada kolom yang dipilih tetapi tidak tersedia dalam indeks.
EXPLAIN (ANALYZE)
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;
-- Look for: Index Only Scan ... Heap Fetches: 0Catatan tentang Peta Visibilitas PostgreSQL
Satu hal penting tentang PostgreSQL yang layak mendapat poin bonus: Pemindaian Hanya Indeks masih dapat menyentuh heap jika sebuah halaman belum ditandai terlihat oleh semua baris dalam peta visibilitas. Setelah pembaruan besar-besaran, jalankan VACUUM agar peta visibilitas tetap mutakhir; jika tidak, Heap Fetches meningkat dan manfaat "hanya indeks" menyusut.
-- Keeps the visibility map fresh so index-only scans stay heap-free
VACUUM ANALYZE orders;Kapan NOT Membuat Indeks Pencakup yang Lebar
Indeks pencakup tidak gratis. Memasukkan banyak kolom ke INCLUDE membuat indeks besar, menghabiskan cache, dan memperlambat penulisan (setiap penulisan terkait memperbarui indeks). Implikasi yang perlu Anda sampaikan:
- Sangat baik untuk kueri pembacaan yang aktif, sempit, dan sering dijalankan.
- Buruk jika dijadikan tempat menampung setiap kolom "untuk berjaga-jaga".
Cakup kueri yang penting, bukan seluruh baris.
Cara Mengungkapkannya dalam Wawancara
Ringkasan yang jelas:
'Indeks pencakup berisi setiap kolom yang disentuh kueri, sehingga mesin dapat menjawabnya hanya dari indeks melalui Pemindaian Hanya Indeks, tanpa pengambilan dari heap. Saya menempatkan kolom yang dicari di dalam kunci dan kolom yang hanya dikembalikan di dalam INCLUDE, memverifikasi bahwa Heap Fetches bernilai nol dengan EXPLAIN ANALYZE, serta menjaga indeks tetap sempit untuk melindungi kecepatan penulisan.'
Pemeriksaan Cepat
Analisis pencakupan dan tempat yang tepat untuk setiap kolom.
Ringkasan: Indeks Pencakup
Pokok-pokok penting:
- Indeks mencakup kueri jika indeks tersebut memuat setiap kolom yang diperlukan kueri, sehingga memungkinkan Pemindaian Hanya Indeks tanpa pengambilan dari heap.
- Kolom kunci mengarahkan pencarian dan mengikuti aturan prefiks paling kiri; kolom INCLUDE merupakan muatan yang hanya berada pada daun untuk pencakupan.
- Indeks sekunder InnoDB secara implisit menyertakan kunci utama.
- Verifikasi dengan
EXPLAIN (ANALYZE)dan perhatikanHeap Fetches; di PostgreSQL, pastikanVACUUMtetap mutakhir. - Jaga indeks pencakup tetap sempit untuk melindungi kinerja penulisan.
Berikutnya: sisi sebaliknya, yaitu saat indeks justru merugikan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Indeks yang Mencakup dan Pemindaian Hanya Indeks” gratis?
Ya — teks lengkap “Indeks yang Mencakup dan Pemindaian Hanya Indeks” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Indeks yang Mencakup dan Pemindaian Hanya Indeks”?
Menyertakan kolom agar kueri tidak perlu menyentuh heap tabel. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Indeks yang Mencakup dan Pemindaian Hanya Indeks” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Indeks B-Tree dan Manfaatnya
- Urutan Kolom pada Indeks Komposit
- Indeks yang Mencakup dan Pemindaian Hanya Indeks
- Saat Indeks Merugikan: Penulisan dan Selektivitas