簡體   English   中英

使用Postgres 9.5 GIN索引和JSONB

[英]Using Postgres 9.5 GIN indexes and JSONB

我正在嘗試創建一個Postgres GIN索引來加快以下查詢的速度:

CREATE TABLE foo (
    id serial primary key,
    a jsonb not null
);

insert into foo(a) values
    ('[{"b": "aaa"}, {"b": "ddd"}]'::jsonb),
    ('[{"b": "aaa"}, {"b": "aaa"}]'::jsonb),
    ('[{"b": "aaa"}]'::jsonb),
    ('[{"b": "aaa"}]'::jsonb),
    ('[{"b": "aaa"}]'::jsonb),
    ('[{"b": "bbb"}]'::jsonb),
    ('[{"b": "bbb"}]'::jsonb),
    ('[{"b": "bbb"}]'::jsonb),
    ('[{"b": "ccc"}]'::jsonb),
    ('[]'::jsonb);

select distinct id from (
    select id, jsonb_array_elements(a)->>'b' as b from foo
) t where t.b = 'aaa'

在Postgres中有這種可能嗎? 我也歡迎其他選擇。 不幸的是,我無法規范化表,所以我需要使用已經擁有的表結構。

是的,您可以在此處應用GIN索引,但它可能不是特別有用:

CREATE INDEX find_fast_jsonb_value
ON foo USING GIN (a jsonb_path_ops);

現在,您仍然必須在數組中搜索匹配的鍵/值對。 您的查詢將變為:

SELECT DISTINCT id
FROM foo, jsonb_array_elements(a) AS t(b)  -- Implicit LATERAL join
WHERE b @> '{"b": "aaa"}';                 -- Comparing json key/values here

這還將set-returning-functions jsonb_array_elements()放在它所屬的FROM子句中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM