Pemindaian Berurutan vs Pemindaian Indeks
Ketahui kapan pemindaian berurutan sudah memadai, kapan pemindaian indeks diperlukan, dan bagaimana perencana menentukan pilihannya
Pemindaian Berurutan vs Pemindaian Indeks adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Dua Cara Menemukan Baris
Basis data memiliki dua strategi dasar untuk membaca baris:
- Pemindaian Sekuensial — membaca setiap halaman tabel
- Pemindaian Indeks — menelusuri indeks, lalu mengambil baris yang cocok
Saat Pemindaian Sekuensial Tepat
Jika Anda memang memerlukan sebagian besar tabel, pemindaian tabel lebih murah daripada membaca indeks DAN mengambil setiap baris yang cocok. Secara kasar: lebih dari sekitar 10–20% baris → pemindaian sekuensial lebih unggul.
Saat Pemindaian Indeks Lebih Unggul
Untuk kueri selektif (sebagian kecil baris), indeks memberikan keuntungan:
EXPLAIN SELECT * FROM users WHERE id = 42;
-- Index Scan using users_pkey (cost=0.43..8.45 rows=1)
EXPLAIN SELECT * FROM users WHERE active;
-- Seq Scan on users (cost=0.00..15000.00 rows=950000)
-- (because most users are active)Pemindaian Indeks vs Pemindaian Hanya Indeks
Kadang-kadang indeks saja sudah memiliki semua kolom yang Anda perlukan—tidak perlu mengambil data dari tabel. Inilah Pemindaian Hanya Indeks:
CREATE INDEX users_email_id_idx ON users(id) INCLUDE (email);
EXPLAIN SELECT email FROM users WHERE id = 42;
-- Index Only Scan using users_email_id_idxPemindaian Indeks Bitmap
Untuk selektivitas menengah, PostgreSQL mungkin membuat bitmap baris yang cocok, lalu mengambilnya dalam urutan fisik—lebih cepat daripada I/O acak:
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
-- Recheck Cond: (status = 'pending')
-- -> Bitmap Index Scan on orders_status_idxMengapa Perencana Memilih Pemindaian Sekuensial
Alasan umum:
- Tidak ada indeks pada kolom yang difilter
- Indeks tidak dapat digunakan (fungsi pada kolom, klausa OR, ketidakcocokan tipe)
- Perkiraan jumlah baris terlalu tinggi sehingga penggunaan indeks tidak sepadan
- Statistik sudah usang dan perencana salah menilai selektivitas
Memaksa Penggunaan Indeks (dengan Hati-Hati)
Anda tidak dapat memberikan petunjuk langsung kepada PostgreSQL. Sebagai gantinya:
- Jalankan ANALYZE untuk memperbarui statistik
- Tambahkan indeks yang tepat
- Tetapkan pengaturan sesi:
SET enable_seqscan = off;untuk diagnosis (bukan untuk produksi)
Predikat yang Dapat Diindeks
Agar indeks membantu, WHERE harus "ramah indeks"—membandingkan kolom yang diindeks secara langsung:
-- GOOD:
WHERE created_at >= '2024-01-01'
-- BAD (function on the column):
WHERE date_trunc('day', created_at) = '2024-01-01'
-- BAD (cast):
WHERE created_at::DATE = '2024-01-01'
-- FIX: add a functional index, or rewrite with range.Urutan Indeks Gabungan
Indeks pada (a, b) membantu kueri pada a saja dan pada a AND b, tetapi tidak pada b saja.
Ukuran Indeks Penting
Indeks B-tree yang ramping dengan kunci yang sering digunakan mungkin dapat sepenuhnya berada di memori; indeks yang lebar mungkin tidak. Indeks yang lebih kecil lebih cepat.
Verifikasi Rencana
Setelah menambahkan indeks, jalankan EXPLAIN ANALYZE untuk memastikan perencana benar-benar menggunakannya. Jika tidak, selidiki lebih lanjut.
Rangkuman
Pemindaian sekuensial dan pemindaian indeks ditentukan oleh selektivitas.
- Filter selektif → pemindaian indeks
- Sebagian besar tabel → pemindaian sekuensial
- Pemindaian bitmap untuk kondisi di antaranya
- Perhatikan apakah predikat ramah indeks
Pemeriksaan Singkat
Mengapa PostgreSQL mungkin memilih pemindaian sekuensial daripada indeks yang sudah ada?
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pemindaian Berurutan vs Pemindaian Indeks” gratis?
Ya — teks lengkap “Pemindaian Berurutan vs Pemindaian Indeks” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pemindaian Berurutan vs Pemindaian Indeks”?
Ketahui kapan pemindaian berurutan sudah memadai, kapan pemindaian indeks diperlukan, dan bagaimana perencana menentukan pilihannya Kamu berlatih SQL Academy 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 Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy 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 2 dari 4.
Berapa lama pelajaran “Pemindaian Berurutan vs Pemindaian 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 Academy ini?
Ya. Setiap pelajaran SQL Academy 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
- Membaca EXPLAIN dan EXPLAIN ANALYZE
- Pemindaian Berurutan vs Pemindaian Indeks
- Hash Join vs Merge Join vs Nested Loop
- Mengidentifikasi dan Memperbaiki Kueri Lambat