SQL Academy · Lezione

Indicizzare JSONB con GIN

Crei indici GIN sui documenti JSONB e utilizzi jsonb_path_ops per query di contenimento rapide.

Lezione 3 di 413 passaggi

Indicizzare JSONB con GIN è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Perché usare GIN per JSONB

I documenti JSONB contengono molti «elementi» (coppie chiave/valore ed elementi di array). GIN (indice invertito generalizzato) è progettato per le query «righe in cui il documento contiene X».

Indice GIN predefinito

La classe di operatori predefinita supporta @>, ?, ?| e ?&:

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: più piccolo e più veloce

Ha dimensioni dimezzate ed è più veloce per le query basate solo sul contenimento, ma supporta SOLO @>:

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

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

Indicizzare un solo percorso

Se si interroga una sola chiave, un indice B-tree su espressione applicato al valore estratto è ancora più veloce:

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

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

Indicizzare gli array interni

Usare un indice GIN sul percorso dell'array:

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

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

Combinare un indice JSONB con altri filtri

I predicati compositi possono usare l'indice GIN per la parte JSONB e un altro indice per la parte 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

Prestazioni di scrittura di GIN

Gli aggiornamenti GIN sono più pesanti di quelli B-tree. Per le tabelle con moltissime scritture, l'opzione fastupdate raggruppa gli aggiornamenti GIN in una pending list, svuotata da 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');

Dimensioni dell'indice

Gli indici GIN su JSONB possono essere grandi. Per tabelle enormi, valutare:

  • Indicizzare solo percorsi specifici (indice su espressione)
  • Passare a jsonb_path_ops per il solo contenimento
  • Spostare i campi più utilizzati in colonne reali

Combinazione con Trigram

Per la ricerca testuale approssimata all'interno di JSONB, estrarre i dati in un'espressione TEXT e aggiungere un indice GIN pg_trgm:

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

Quando l'indicizzazione non è utile

Se il filtro riguarda ogni riga (selettività molto bassa), il planner può scegliere una scansione sequenziale anche in presenza dell'indice. Usare EXPLAIN ANALYZE per verificare.

Manutenzione degli indici JSONB

Gli indici GIN sono soggetti a bloat come qualsiasi altro indice. Usare periodicamente REINDEX CONCURRENTLY:

REINDEX INDEX CONCURRENTLY events_data_gin;

Riepilogo

GIN trasforma i filtri JSONB in ricerche eseguite in millisecondi.

  • GIN predefinito: @>, ?, ?|, ?&
  • jsonb_path_ops: più piccolo, solo contenimento
  • B-tree su espressione applicato allo scalare estratto: la soluzione più veloce per una singola chiave

Verifica rapida

Si interroga una colonna JSONB esclusivamente con data @> .... Quale indice offre le dimensioni minori con il supporto completo delle funzionalità?

Gratis per iniziare

Impara SQL con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
46
Lezioni
183

Domande Frequenti

La lezione «Indicizzare JSONB con GIN» è gratuita?

Sì — il testo completo di «Indicizzare JSONB con GIN» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Indicizzare JSONB con GIN»?

Crei indici GIN sui documenti JSONB e utilizzi jsonb_path_ops per query di contenimento rapide. Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Indicizzare JSONB con GIN»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. JSONB e JSON: quando usare ciascuno
  2. Operatori per i percorsi: -> ->> @>
  3. Indicizzare JSONB con GIN
  4. Modellazione: quando JSONB supera la normalizzazione
← Torna a SQL Academy