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 tsWydajność 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
- JSONB a JSON: kiedy używać którego
- Operatory ścieżek: -> ->> @>
- Indeksowanie JSONB za pomocą GIN
- Modelowanie: kiedy JSONB wygrywa z normalizacją