0Pricing
SQL Academy · Lekcja

Indeksowanie JSONB za pomocą GIN

Tworzyć indeksy GIN dla dokumentów JSONB i używać jsonb_path_ops do szybkich zapytań sprawdzających zawieranie

Indeksowanie JSONB za pomocą GIN to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Dlaczego GIN dla JSONB

Dokumenty JSONB zawierają wiele „elementów” (par klucz/wartość i elementów tablic). GIN (Generalised Inverted Index) został stworzony z myślą o zapytaniach typu „wiersze, w których dokument zawiera X”.

Domyślny indeks GIN

Domyślna klasa operatorów obsługuje @>, ?, ?| i ?&:

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: mniejszy i szybszy

Ma połowę rozmiaru i działa szybciej w przypadku zapytań dotyczących wyłącznie zawierania, ale obsługuje TYLKO @>:

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

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

Indeksowanie tylko jednej ścieżki

Jeśli odpytywany jest tylko jeden klucz, jeszcze szybszy będzie indeks B-tree wyrażenia na wyodrębnionej wartości:

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

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

Indeksowanie wewnątrz tablic

Należy użyć indeksu GIN na ścieżce tablicy:

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

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

Łączenie indeksu JSONB z innymi filtrami

Predykaty złożone mogą używać indeksu GIN dla części JSONB oraz innego indeksu dla części niebędącej 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

Wydajność zapisu GIN

Aktualizacje indeksów GIN są bardziej kosztowne niż aktualizacje B-tree. W tabelach z bardzo dużą liczbą zapisów opcja fastupdate grupuje aktualizacje GIN na liście oczekującej opróżnianej przez 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');

Rozmiar indeksu

Indeksy GIN dla JSONB mogą być duże. W przypadku ogromnych tabel należy rozważyć:

  • Indeksowanie tylko określonych ścieżek (indeks wyrażenia)
  • Przejście na jsonb_path_ops w przypadku zapytań dotyczących wyłącznie zawierania
  • Przeniesienie często używanych pól do rzeczywistych kolumn

Łączenie z trigramami

W przypadku przybliżonego wyszukiwania tekstu wewnątrz JSONB należy wyodrębnić tekst do wyrażenia typu TEXT i dodać indeks GIN pg_trgm:

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

Kiedy indeksowanie nie pomaga

Jeśli filtr dotyczy każdego wiersza (ma bardzo niską selektywność), optymalizator może wybrać skanowanie sekwencyjne nawet mimo obecności indeksu. Aby to potwierdzić, należy użyć EXPLAIN ANALYZE.

Utrzymywanie indeksów JSONB

Indeksy GIN rozrastają się tak jak wszystkie inne indeksy. Należy okresowo używać REINDEX CONCURRENTLY:

REINDEX INDEX CONCURRENTLY events_data_gin;

Podsumowanie

GIN zmienia filtrowanie JSONB w wyszukiwanie trwające milisekundy.

  • Domyślny GIN: @>, ?, ?|, ?&
  • jsonb_path_ops: mniejszy, tylko do zawierania
  • Indeks B-tree wyrażenia na wyodrębnionej wartości skalarnej: najszybszy dla jednego klucza

Szybkie sprawdzenie

Kolumna JSONB jest używana wyłącznie w zapytaniach data @> .... Który indeks zapewnia najmniejszy rozmiar przy pełnej obsłudze wymaganej funkcji?

Często zadawane pytania

Czy lekcja „Indeksowanie JSONB za pomocą GIN” jest bezpłatna?

Tak — pełny tekst „Indeksowanie JSONB za pomocą GIN” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Indeksowanie JSONB za pomocą GIN”?

Tworzyć indeksy GIN dla dokumentów JSONB i używać jsonb_path_ops do szybkich zapytań sprawdzających zawieranie Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Indeksowanie JSONB za pomocą GIN”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. JSONB a JSON: kiedy używać którego
  2. Operatory ścieżek: -> ->> @>
  3. Indeksowanie JSONB za pomocą GIN
  4. Modelowanie: kiedy JSONB wygrywa z normalizacją
← Powrót do SQL Academy