>데이터 베이스 >MySQL 튜토리얼 >PostgreSQL에서 JSON 배열 내의 요소를 효율적으로 검색하려면 어떻게 해야 합니까?

PostgreSQL에서 JSON 배열 내의 요소를 효율적으로 검색하려면 어떻게 해야 합니까?

DDD
DDD원래의
2025-01-21 04:17:11896검색

PostgreSQL에서 JSON 배열 요소를 효율적으로 검색하기 위한 팁

How Can I Efficiently Search for Elements Within JSON Arrays in PostgreSQL?

JSON 배열의 특정 요소 검색을 최적화하려면 PostgreSQL 버전과 데이터 구조를 고려해야 합니다.

PostgreSQL 9.4 및 JSONB

PostgreSQL 9.4 이상에서는 바이너리 JSON 데이터 유형jsonb이 크게 향상된 색인 기능을 제공합니다. jsonb 배열에서 직접 GIN 인덱스를 생성할 수 있습니다:

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

이 인덱스를 사용하면 @> 연산자를 사용하여 효율적인 쿼리를 수행할 수 있습니다.

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

또는 특수 jsonb_path_ops GIN 연산자 클래스를 사용할 수 있습니다:

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

쿼리문은 변경되지 않습니다.

PostgreSQL 9.3 및 JSON

PostgreSQL 9.3의 경우 IMMUTABLE 함수를 사용하여 JSON 배열 요소를 텍스트 값 배열로 추출하는 것이 좋습니다.

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

그런 다음 추출된 배열에 기능적 GIN 인덱스를 생성합니다.

<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[] <@ (json2arr(artists, 'name'));</code>

함수 인덱싱은 IMMUTABLE 함수에만 사용할 수 있습니다. json_array_elements() 함수 및 사용된 기타 JSON 함수의 변경 가능성을 검증합니다.

위 내용은 PostgreSQL에서 JSON 배열 내의 요소를 효율적으로 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.