SQL Academy · Lektion

Indeksering af JSONB med GIN

Opret GIN-indekser på JSONB-dokumenter, og brug jsonb_path_ops til hurtige forespørgsler efter indeholdelse.

Lektion 3 af 413 trin

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 ts

GIN-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?

Gratis at komme i gang

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

  1. JSONB vs. JSON: Hvornår skal De bruge hvad
  2. Stioperatorer: -> ->> @>
  3. Indeksering af JSONB med GIN
  4. Modellering: Hvornår JSONB er bedre end normalisering
← Tilbage til SQL Academy