0Pricing
SQL Academy · Lektion

JSONB mit GIN indizieren

Erstellen Sie GIN-Indizes für JSONB-Dokumente und verwenden Sie jsonb_path_ops für schnelle Abfragen zur Enthaltensein-Beziehung.

JSONB mit GIN indizieren ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum GIN für JSONB

JSONB-Dokumente enthalten viele „Elemente“ (Schlüssel-Wert-Paare und Array-Elemente). GIN (Generalised Inverted Index) ist für Abfragen nach dem Muster „Zeilen, deren Dokument X enthält“ ausgelegt.

Standardmäßiger GIN-Index

Die standardmäßige Operator-Klasse unterstützt @>, ?, ?| und ?&:

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: Kleiner und schneller

Nur halb so groß und schneller bei Abfragen, die ausschließlich das Enthaltensein prüfen, unterstützt aber NUR @>:

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

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

Nur einen Pfad indizieren

Wenn Sie nur einen Schlüssel abfragen, ist ein Ausdrucks-B-Tree-Index auf dem extrahierten Wert noch schneller:

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

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

Innerhalb von Arrays indizieren

Verwenden Sie einen GIN-Index auf dem Array-Pfad:

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

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

JSONB-Index mit anderen Filtern kombinieren

Zusammengesetzte Prädikate können den GIN-Index für den JSONB-Teil und einen weiteren Index für den Nicht-JSONB-Teil verwenden:

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-Schreibperformance

GIN-Aktualisierungen sind aufwendiger als bei B-Tree-Indizes. Bei Tabellen mit sehr vielen Schreibvorgängen bündelt die Option fastupdate GIN-Aktualisierungen in einer Pending-Liste, die von VACUUM geleert wird.

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');

Indexgröße

JSONB-GIN-Indizes können groß sein. Bei sehr großen Tabellen sollten Sie Folgendes erwägen:

  • Nur bestimmte Pfade indizieren (Ausdrucksindex)
  • Für Abfragen, die ausschließlich das Enthaltensein prüfen, zu jsonb_path_ops wechseln
  • Häufig verwendete Felder in echte Spalten auslagern

Mit Trigrammen kombinieren

Für eine unscharfe Textsuche innerhalb von JSONB extrahieren Sie den Wert in einen TEXT-Ausdruck und fügen Sie einen pg_trgm-GIN-Index hinzu:

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

Wann Indizierung nicht hilft

Wenn Ihr Filter jede Zeile betrifft (sehr geringe Selektivität), kann der Planner trotz des Indexes einen sequenziellen Scan wählen. Bestätigen Sie dies mit EXPLAIN ANALYZE.

JSONB-Indizes warten

GIN-Indizes werden wie alle anderen Indizes aufgebläht. Verwenden Sie regelmäßig REINDEX CONCURRENTLY:

REINDEX INDEX CONCURRENTLY events_data_gin;

Zusammenfassung

GIN verwandelt JSONB-Filter in Abfragen mit Antwortzeiten im Millisekundenbereich.

  • Standardmäßiger GIN: @>, ?, ?|, ?&
  • jsonb_path_ops: kleiner, nur für Enthaltensein
  • Ausdrucks-B-Tree auf einem extrahierten Skalarwert: am schnellsten für einen einzelnen Schlüssel

Kurztest

Sie fragen für eine JSONB-Spalte ausschließlich data @> ... ab. Welcher Index bietet bei vollständigem Funktionsumfang die geringste Größe?

Häufig gestellte Fragen

Ist die Lektion „JSONB mit GIN indizieren“ kostenlos?

Ja — der vollständige Text von „JSONB mit GIN indizieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „JSONB mit GIN indizieren“?

Erstellen Sie GIN-Indizes für JSONB-Dokumente und verwenden Sie jsonb_path_ops für schnelle Abfragen zur Enthaltensein-Beziehung. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Academy zu starten?

Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „JSONB mit GIN indizieren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?

Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. JSONB vs. JSON: Wann Sie welches verwenden
  2. Pfadoperatoren: -> ->> @>
  3. JSONB mit GIN indizieren
  4. Datenmodellierung: Wann JSONB die Normalisierung übertrifft
← Zurück zu SQL Academy