집 >데이터 베이스 >MySQL 튜토리얼 >PostgreSQL에서 JSON 배열 내의 요소를 효율적으로 검색하려면 어떻게 해야 합니까?
JSON 배열의 특정 요소 검색을 최적화하려면 PostgreSQL 버전과 데이터 구조를 고려해야 합니다.
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의 경우 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!