首頁 >資料庫 >mysql教程 >如何在 PostgreSQL 中有效地索引 JSON 陣列以加快元素檢索速度?

如何在 PostgreSQL 中有效地索引 JSON 陣列以加快元素檢索速度?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-21 04:21:09211瀏覽

高效索引PostgreSQL中的JSON數組以加快元素檢索

在PostgreSQL表中快速辨識和檢索JSON數組內的元素可能具有挑戰性。為了獲得最佳效能,請務必了解適合您特定資料和查詢要求的索引技術。

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

在PostgreSQL 9.4 中使用JSONB

PostgreSQL 9.4引入了二進位JSON資料型別jsonb,這大大增強了索引可能性。利用jsonb可以直接在JSON數組上建立GIN索引。

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

這使得可以使用GIN索引的查詢成為可能,例如:

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

其中@>表示jsonb的「包含」運算子。

或者,您可以使用jsonb_path_ops GIN運算符類別(非默認,通常更小且更快):

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

針對唯一名稱值進行最佳化

如果您的artists列只包含唯一名稱值的數組,則更有效的方法是將值儲存為JSON文字基元,而不是物件。這消除了冗餘鍵的需要。

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

查詢範例:

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

在PostgreSQL 9.3 處理json

對於9.4之前的PostgreSQL版本,可以使用不變函數和GIN索引。

建立函數:

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

然後建立函數索引:

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

使用與索引表達式相符的查詢:

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

務必確保索引中使用的函數是不變的,以啟用函數索引。關鍵運算子...

文章對原文進行了改寫,使用了更簡潔的語言,並對部分語句進行了調整,但保留了原文的核心內容和圖片位置。

以上是如何在 PostgreSQL 中有效地索引 JSON 陣列以加快元素檢索速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn