Heim > Datenbank > MySQL-Tutorial > Wie können JSON-Arrays in PostgreSQL effizient indiziert werden, um den Elementabruf zu beschleunigen?

Wie können JSON-Arrays in PostgreSQL effizient indiziert werden, um den Elementabruf zu beschleunigen?

Mary-Kate Olsen
Freigeben: 2025-01-21 04:21:09
Original
206 Leute haben es durchsucht

Indizieren Sie JSON-Arrays in PostgreSQL effizient für einen schnelleren Elementabruf

Das schnelle Identifizieren und Abrufen von Elementen innerhalb eines JSON-Arrays in einer PostgreSQL-Tabelle kann eine Herausforderung sein. Für eine optimale Leistung ist es wichtig, die Indizierungstechnologie zu verstehen, die für Ihre spezifischen Daten- und Abfrageanforderungen geeignet ist.

How to Efficiently Index JSON Arrays in PostgreSQL for Faster Element Retrieval?

Verwendung von JSONB in ​​​​PostgreSQL 9.4

PostgreSQL 9.4 führt den binären JSON-Datentyp jsonb ein, der die Indizierungsmöglichkeiten erheblich erweitert. Verwenden Sie jsonb, um GIN-Indizes direkt auf JSON-Arrays zu erstellen.

<code class="language-sql">CREATE TABLE tracks (id serial, artists jsonb);
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);</code>
Nach dem Login kopieren

Dies ermöglicht Abfragen, die GIN-Indizes verwenden können, zum Beispiel:

<code class="language-sql">SELECT * FROM tracks WHERE artists @> '["The Dirty Heads"]';</code>
Nach dem Login kopieren

wobei @> den „contains“-Operator von jsonb darstellt.

Alternativ können Sie die GIN-Operatorklasse jsonb_path_ops verwenden (nicht standardmäßig, normalerweise kleiner und schneller):

<code class="language-sql">CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists jsonb_path_ops);</code>
Nach dem Login kopieren

Für eindeutige Namenswerte optimieren

Wenn Ihre artists-Spalte nur ein Array eindeutig benannter Werte enthält, ist es effizienter, die Werte als JSON-Textprimitive statt als Objekte zu speichern. Dadurch entfällt die Notwendigkeit redundanter Schlüssel.

<code class="language-sql">CREATE TABLE tracks (id serial, artistnames jsonb);
INSERT INTO tracks VALUES (2, '["The Dirty Heads", "Louis Richards"]');
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING gin (artistnames);</code>
Nach dem Login kopieren

Abfragebeispiel:

<code class="language-sql">SELECT * FROM tracks WHERE artistnames ? 'The Dirty Heads';
SELECT * FROM tracks WHERE artistnames @> '"The Dirty Heads"'::jsonb;</code>
Nach dem Login kopieren

Umgang mit JSON in PostgreSQL 9.3

Für PostgreSQL-Versionen vor 9.4 können invariante Funktionen und GIN-Indizes verwendet werden.

Funktion erstellen:

<code class="language-sql">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)';</code>
Nach dem Login kopieren

Dann erstellen Sie den Funktionsindex:

<code class="language-sql">CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (json2arr(artists, 'name'));</code>
Nach dem Login kopieren

Verwenden Sie eine Abfrage, die dem Indexausdruck entspricht:

<code class="language-sql">SELECT * FROM tracks WHERE '{"The Dirty Heads"}'::text[]</code>
Nach dem Login kopieren

Stellen Sie immer sicher, dass die im Index verwendeten Funktionen unveränderlich sind, um die Funktionsindizierung zu ermöglichen. Hauptbetreiber...

Der Artikel hat den Originaltext neu geschrieben, eine prägnantere Sprache verwendet und einige Sätze angepasst, behält aber den Kerninhalt des Originaltextes und die Position der Bilder bei.

Das obige ist der detaillierte Inhalt vonWie können JSON-Arrays in PostgreSQL effizient indiziert werden, um den Elementabruf zu beschleunigen?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage