Heim > Datenbank > MySQL-Tutorial > Wie kann man JSONB-Arrays in PostgreSQL effizient indizieren und abfragen?

Wie kann man JSONB-Arrays in PostgreSQL effizient indizieren und abfragen?

DDD
Freigeben: 2025-01-06 13:29:40
Original
337 Leute haben es durchsucht

How to Efficiently Index and Query JSONB Arrays in PostgreSQL?

Richtiger Index zum Abfragen von Strukturen in Arrays in Postgres JSONB

Um Arrays strukturierter Daten, die in einem Postgres-JSONB-Feld gespeichert sind, effektiv zu indizieren und abzufragen, Beachten Sie die folgenden Schritte:

1. Korrekter Array-Zugriff:

Verwenden Sie die richtige Syntax, um auf Array-Elemente in einem JSONB-Kontext zuzugreifen. Zum Beispiel:

e->0->>'event_slug'
Nach dem Login kopieren

2. Benutzerdefinierte Operatoren für JSONB:

Verwenden Sie JSONPATH-Operatoren für Größer-als- oder Kleiner-als-Vergleiche in JSONB-Feldern. Verwenden Sie in Postgres 12 oder höher @?:

e->0->>'end_time' @> '2014-10-13'
Nach dem Login kopieren

Oder verwenden Sie in älteren Versionen jsonb_path_ops:

CREATE INDEX events_gin_idx ON locations USING GIN (events jsonb_path_ops);
Nach dem Login kopieren

3. Grundlegende Lösung für Postgres 12:

Verwenden Sie für Gleichheitsprüfungen das @? Operator:

SELECT l.*
FROM locations l
WHERE l.events @? '$[*] ? (@.event_slug == "test_1")';
Nach dem Login kopieren

Für OR-Filter verwenden Sie die folgende Syntax:

SELECT l.*
FROM locations l
WHERE l.events @? '$[*] ? (@.event_slug == "test_1") ? (@.start_time.datetime() < "2014-10-13".datetime() || @.end_time.datetime() < "2014-10-13".datetime())';
Nach dem Login kopieren

4. Grundlegende Lösung für jede Postgres-Version:

Für Gleichheitsprüfungen verwenden Sie das @> Operator:

SELECT * FROM locations WHERE events @> '[{&quot;event_slug&quot;:&quot;test_1&quot;}]';
Nach dem Login kopieren

Für Prüfungen, die größer oder gleich sind, verwenden Sie eine Unterabfrage:

SELECT l.*
FROM locations l
JOIN jsonb_array_elements(l.events) e ON l.events @> '[{&quot;event_slug&quot;:&quot;test_1&quot;}]'
WHERE (e->>'end_time')::timestamp >= '2014-10-30 14:04:06'::timestamptz;
Nach dem Login kopieren

5. Erweiterte Lösung mit materialisierter Ansicht:

Für eine optimale Leistung bei komplexen Abfragen sollten Sie die Erstellung einer materialisierten Ansicht in Betracht ziehen, die relevante Daten in normalisierter Form speichert:

CREATE MATERIALIZED VIEW loc_event AS
SELECT l.location_id, e.event_slug, e.end_time
FROM locations l, jsonb_populate_recordset(null::event_type, l.events) e;
Nach dem Login kopieren

6. Indizieren und Abfragen der materialisierten Ansicht:

CREATE INDEX loc_event_idx ON loc_event (event_slug, end_time, location_id);
Nach dem Login kopieren
SELECT *
FROM loc_event
WHERE event_slug = 'test_1'
AND end_time >= '2014-10-30 14:04:06 -0400'::timestamptz;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man JSONB-Arrays in PostgreSQL effizient indizieren und abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage