0Pricing
SQL Academy · Pelajaran

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 queries

Indeks 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

  1. Indeks B-tree vs Hash vs GiST vs GIN
  2. Indeks Komposit dan Urutan Kolom
  3. Indeks Parsial dan Ekspresi
  4. Pemeliharaan Indeks dan Bloat
← Kembali ke SQL Academy