Um die Suche nach bestimmten Elementen in einem JSON-Array zu optimieren, sollten Sie unbedingt die PostgreSQL-Version und Datenstruktur berücksichtigen.
In PostgreSQL 9.4 und höher bietet der binäre JSON-Datentyp jsonb
deutlich verbesserte Indizierungsfunktionen. Sie können einen GIN-Index direkt im jsonb
-Array erstellen:
CREATE TABLE tracks (id serial, artists jsonb); -- ! CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
Dieser Index ermöglicht effiziente Abfragen mit dem @>
-Operator:
SELECT * FROM tracks WHERE artists @> '[{"name": "The Dirty Heads"}]';
Alternativ können Sie die spezielle jsonb_path_ops
GIN-Operatorklasse verwenden:
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists jsonb_path_ops); -- !
Die Abfrageanweisung bleibt unverändert.
Erwägen Sie für PostgreSQL 9.3 die Verwendung einer IMMUTABLE
-Funktion, um die Elemente eines JSON-Arrays in ein Array von Textwerten zu extrahieren:
CREATE OR REPLACE FUNCTION json2arr(_j json, _key text) RETURNS text[] LANGUAGE sql IMMUTABLE AS 'SELECT ARRAY(SELECT elem->>_key FROM json_array_elements(_j) elem)';
Erstellen Sie dann einen funktionalen GIN-Index für das extrahierte Array:
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (json2arr(artists, 'name'));
Verwenden Sie in Abfragen Array-Operatoren, um Indexausdrücke abzugleichen:
SELECT * FROM tracks WHERE '{"The Dirty Heads"}'::text[] <@ (json2arr(artists, 'name'));
Bitte beachten Sie, dass die Funktionsindizierung nur mit IMMUTABLE
-Funktionen verwendet werden kann. Überprüfen Sie die Veränderlichkeit der Funktion json_array_elements()
und aller anderen verwendeten JSON-Funktionen.
Das obige ist der detaillierte Inhalt vonWie kann ich in PostgreSQL effizient nach Elementen in JSON-Arrays suchen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!