Indeks B-tree vs Hash vs GiST vs GIN
Bandingkan jenis indeks utama di PostgreSQL dan pilih yang tepat untuk kueri kesetaraan, rentang, geometri, JSON, dan teks lengkap
Indeks B-tree vs Hash vs GiST vs GIN adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.
Ikhtisar Jenis Indeks
PostgreSQL memiliki beberapa jenis indeks, masing-masing dioptimalkan untuk pola akses yang berbeda:
- B-tree — kesetaraan dan rentang (bawaan)
- Hash — hanya kesetaraan
- GiST — geometrik, teks lengkap, kustom
- GIN — gabungan (larik, JSONB, teks lengkap)
- BRIN — rentang blok—tabel besar yang diurutkan
- SP-GiST — pohon yang dipartisi berdasarkan ruang
B-tree: Bawaan
Digunakan 95% dari waktu. Mendukung =, <, <=, >, >=, BETWEEN, ORDER BY:
CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);Indeks Hash
Hanya untuk pencarian berdasarkan kesetaraan. Aman terhadap kerusakan sejak PG 10. Lebih kecil dan sedikit lebih cepat daripada B-tree untuk kesetaraan murni, tetapi kasus penggunaannya sangat terbatas:
CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.Indeks GiST
Pohon Pencarian Umum—dapat dipasang, mendukung jenis rentang, jenis geometrik, alamat IP, dan teks lengkap:
CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.
CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.Indeks GIN
Indeks Terbalik Umum—paling baik untuk nilai gabungan yang setiap elemennya dipetakan ke banyak baris:
CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators
CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queriesIndeks BRIN
Indeks Rentang Blok meringkas rentang nilai untuk setiap N halaman. Sangat kecil (kilobita untuk tabel terabita), tetapi hanya efektif ketika data diurutkan secara fisik berdasarkan kolom yang diindeks:
CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.Membandingkan Ukuran
Untuk tabel berisi satu miliar baris:
- B-tree pada BIGINT: ~30 GB
- BRIN pada TIMESTAMPTZ: ~1 MB
BRIN jauh lebih kecil, tetapi hanya mengungguli B-tree untuk kueri sekuensial/terurut.
Memilih Jenis Indeks
Alur keputusan:
- Kesetaraan + rentang pada skalar → B-tree
- Kesetaraan pada kumpulan skalar yang sangat besar → B-tree (Hash hanya jika sudah diukur)
- Larik / JSONB / teks lengkap → GIN
- Jenis rentang, geometri, teks samar → GiST
- Tabel sangat besar yang diurutkan, hanya-tambah → BRIN
Kompromi GIN
GIN adalah yang tercepat untuk kueri "temukan semua baris yang berisi X", tetapi lebih lambat untuk INSERT/UPDATE daripada B-tree. Untuk tabel yang sangat sering ditulisi, pertimbangkan fastupdate=off untuk mengendalikan daftar tertunda GIN.
Kelas Operator
Setiap jenis indeks bekerja dengan operator tertentu. JSONB menggunakan jsonb_path_ops untuk indeks yang hanya mendukung pencarian isi, tetapi lebih kecil dan cepat:
CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.Indeks Gabungan per Jenis
Indeks gabungan B-tree menggunakan pencocokan prefiks paling kiri. Indeks gabungan GIN dapat digunakan tetapi lebih besar; biasanya Anda membuat indeks GIN satu kolom secara terpisah.
Rangkuman
Pilih jenis indeks yang sesuai dengan kueri.
- B-tree: bawaan
- GIN: larik/JSONB/teks lengkap
- GiST: rentang/geometri/teks samar
- BRIN: sekuensial/hanya-tambah
Pemeriksaan Singkat
Anda mengindeks kolom TEXT[] untuk kueri "berisi". Jenis indeks mana yang sesuai?
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Indeks B-tree vs Hash vs GiST vs GIN” gratis?
Ya — teks lengkap “Indeks B-tree vs Hash vs GiST vs GIN” 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 “Indeks B-tree vs Hash vs GiST vs GIN”?
Bandingkan jenis indeks utama di PostgreSQL dan pilih yang tepat untuk kueri kesetaraan, rentang, geometri, JSON, dan teks lengkap 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 1 dari 4.
Berapa lama pelajaran “Indeks B-tree vs Hash vs GiST vs GIN” 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
- Indeks B-tree vs Hash vs GiST vs GIN
- Indeks Komposit dan Urutan Kolom
- Indeks Parsial dan Ekspresi
- Pemeliharaan Indeks dan Bloat