0Pricing
SQL Academy · Pelajaran

Mengindeks JSONB dengan GIN

Bangun indeks GIN pada dokumen JSONB dan gunakan jsonb_path_ops untuk kueri containment yang cepat

Mengindeks JSONB dengan GIN adalah pelajaran SQL Academy 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 Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Mengapa GIN untuk JSONB

Dokumen JSONB memiliki banyak “item” (pasangan kunci/nilai dan elemen larik). GIN (Generalised Inverted Index) dibuat untuk kueri “baris yang dokumennya mencakup X”.

Indeks GIN Bawaan

Kelas operator bawaan mendukung @>, ?, ?|, dan ?&:

CREATE INDEX events_data_gin ON events USING GIN (data);

-- These now use the index:
SELECT * FROM events WHERE data @> '{"type":"login"}';
SELECT * FROM events WHERE data ? 'error';

jsonb_path_ops: Lebih Kecil dan Lebih Cepat

Ukurannya setengah dan lebih cepat untuk kueri yang hanya menggunakan pencakupan, tetapi ONLY mendukung @>:

CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);

-- Supports @>
-- Does NOT support ?  ?|  ?&
SELECT * FROM events WHERE data @> '{"type":"login"}';

Indeks Satu Jalur Saja

Jika Anda hanya menguerikan satu kunci, indeks B-tree ekspresi pada nilai yang diekstrak bahkan lebih cepat:

CREATE INDEX events_user_id_idx
  ON events (((data->>'user_id')::BIGINT));

SELECT * FROM events WHERE (data->>'user_id')::BIGINT = 42;

Mengindeks di Dalam Larik

Gunakan indeks GIN pada jalur larik:

CREATE INDEX events_tags_gin
  ON events USING GIN ((data->'tags'));

SELECT * FROM events WHERE data->'tags' @> '["admin"]'::JSONB;

Menggabungkan Indeks JSONB dengan Penyaring Lain

Predikat gabungan dapat menggunakan indeks GIN untuk bagian JSONB dan indeks lain untuk bagian non-JSONB:

EXPLAIN ANALYZE
SELECT * FROM events
WHERE data @> '{"type":"login"}'
  AND ts >= NOW() - INTERVAL '7 days';
-- BitmapAnd: GIN index on data, B-tree on ts

Kinerja Penulisan GIN

Pembaruan GIN lebih berat daripada B-tree. Untuk tabel dengan operasi tulis yang sangat sering, opsi fastupdate mengelompokkan pembaruan GIN dalam daftar tertunda yang dikosongkan oleh VACUUM.

CREATE INDEX events_data_gin ON events USING GIN (data) WITH (fastupdate = on);

-- Flush manually if needed:
SELECT gin_clean_pending_list('events_data_gin');

Ukuran Indeks

Indeks GIN JSONB dapat berukuran besar. Untuk tabel yang sangat besar, pertimbangkan:

  • Mengindeks hanya jalur tertentu (indeks ekspresi)
  • Beralih ke jsonb_path_ops untuk pencakupan saja
  • Memisahkan bidang yang sering digunakan ke dalam kolom nyata

Menggabungkan dengan Trigram

Untuk pencarian teks samar di dalam JSONB, ekstrak ke ekspresi TEXT dan tambahkan indeks GIN pg_trgm:

CREATE INDEX events_message_trgm
  ON events USING GIN ((data->>'message') gin_trgm_ops);

Kapan Pengindeksan Tidak Membantu

Jika penyaring Anda mencakup setiap baris (selektivitas sangat rendah), perencana mungkin memilih pemindaian berurutan meskipun indeks tersedia. Gunakan EXPLAIN ANALYZE untuk memastikan.

Memelihara Indeks JSONB

Indeks GIN membengkak seperti indeks lainnya. Gunakan REINDEX CONCURRENTLY secara berkala:

REINDEX INDEX CONCURRENTLY events_data_gin;

Ringkasan

GIN mengubah penyaringan JSONB menjadi pencarian dalam hitungan milidetik.

  • GIN bawaan: @>, ?, ?|, ?&
  • jsonb_path_ops: lebih kecil, hanya untuk pencakupan
  • B-tree ekspresi pada skalar yang diekstrak: tercepat untuk satu kunci

Pemeriksaan Singkat

Anda hanya pernah menguerikan data @> ... pada kolom JSONB. Indeks mana yang memberikan ukuran terkecil dengan dukungan fitur penuh?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengindeks JSONB dengan GIN” gratis?

Ya — teks lengkap “Mengindeks JSONB dengan 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 “Mengindeks JSONB dengan GIN”?

Bangun indeks GIN pada dokumen JSONB dan gunakan jsonb_path_ops untuk kueri containment yang cepat 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 3 dari 4.

Berapa lama pelajaran “Mengindeks JSONB dengan 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. JSONB vs JSON: Kapan Menggunakan Masing-Masing
  2. Operator Jalur: -> ->> @>
  3. Mengindeks JSONB dengan GIN
  4. Pemodelan: Kapan JSONB Lebih Unggul daripada Normalisasi
← Kembali ke SQL Academy