Indeksering af JSONB med GIN
Opret GIN-indekser på JSONB-dokumenter, og brug jsonb_path_ops til hurtige forespørgsler efter indeholdelse.
Indeksering af JSONB med GIN er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.
Hvorfor GIN til JSONB
JSONB-dokumenter har mange "elementer" (nøgle-værdi-par og array-elementer). GIN (generaliseret inverteret indeks) er udviklet til forespørgsler af typen "rækker, hvor dokumentet indeholder X".
Standard-GIN-indeks
Den standardmæssige operatorfamilie understøtter @>, ?, ?| og ?&:
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: Mindre og hurtigere
Halvt så stort og hurtigere til forespørgsler, der kun bruger indeslutning, men understøtter KUN @>:
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ér kun én sti
Hvis du kun forespørger efter én nøgle, er et B-træ-udtryksindeks på den udtrukne værdi endnu hurtigere:
CREATE INDEX events_user_id_idx
ON events (((data->>'user_id')::BIGINT));
SELECT * FROM events WHERE (data->>'user_id')::BIGINT = 42;Indeksering inde i arrays
Brug et GIN-indeks på array-stien:
CREATE INDEX events_tags_gin
ON events USING GIN ((data->'tags'));
SELECT * FROM events WHERE data->'tags' @> '["admin"]'::JSONB;Kombination af JSONB-indeks med andre filtre
Sammensatte prædikater kan bruge GIN-indekset til JSONB-delen og et andet indeks til den del, der ikke er JSONB:
EXPLAIN ANALYZE
SELECT * FROM events
WHERE data @> '{"type":"login"}'
AND ts >= NOW() - INTERVAL '7 days';
-- BitmapAnd: GIN index on data, B-tree on tsGIN-skriveydelse
GIN-opdateringer er tungere end B-træ-opdateringer. Til tabeller med meget intensiv skrivning samler indstillingen fastupdate GIN-opdateringer i en venteliste, som tømmes af 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');Indeksstørrelse
JSONB-GIN-indekser kan være store. Overvej følgende for meget store tabeller:
- Indeksér kun bestemte stier (udtryksindeks)
- Skift til jsonb_path_ops, hvis forespørgslerne kun bruger indeslutning
- Flyt ofte anvendte felter til rigtige kolonner
Kombination med trigrammer
Ved upræcis tekstsøgning i JSONB skal du udtrække til et TEXT-udtryk og tilføje et pg_trgm-GIN-indeks:
CREATE INDEX events_message_trgm
ON events USING GIN ((data->>'message') gin_trgm_ops);Når indeksering ikke hjælper
Hvis dit filter omfatter hver eneste række (meget lav selektivitet), vælger planner'en måske en sekventiel scanning, selv om indekset findes. Brug EXPLAIN ANALYZE til at bekræfte det.
Vedligeholdelse af JSONB-indekser
GIN-indekser bliver oppustede ligesom alle andre indekser. Brug REINDEX CONCURRENTLY med jævne mellemrum:
REINDEX INDEX CONCURRENTLY events_data_gin;Opsummering
GIN gør JSONB-filtre til opslag på millisekunder.
- Standard-GIN: @>, ?, ?|, ?&
- jsonb_path_ops: mindre, kun til indeslutning
- B-træ-udtryksindeks på udtrukket skalarværdi: hurtigst til én nøgle
Hurtigt tjek
Du forespørger kun efter data @> ... på en JSONB-kolonne. Hvilket indeks giver den mindste størrelse med fuld understøttelse af funktionerne?
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 46
- Lektioner
- 183
Ofte stillede spørgsmål
Er lektionen “Indeksering af JSONB med GIN” gratis?
Ja — hele teksten til “Indeksering af JSONB med GIN” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Indeksering af JSONB med GIN”?
Opret GIN-indekser på JSONB-dokumenter, og brug jsonb_path_ops til hurtige forespørgsler efter indeholdelse. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på SQL Academy?
Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Indeksering af JSONB med GIN”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne SQL Academy-lektion?
Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- JSONB vs. JSON: Hvornår skal De bruge hvad
- Stioperatorer: -> ->> @>
- Indeksering af JSONB med GIN
- Modellering: Hvornår JSONB er bedre end normalisering