我在PostgreSQL中有一个包含一个JSONB列的表。 JSON看起来像这样 - {'key':some_key, 'value': some_value}
我使用 -
key
CREATE INDEX t3_index ON t3 USING GIN ((data->'key'));
桌子的schama看起来像 -
Table "public.t3"
Column | Type | Collation | Nullable | Default
--------+-------+-----------+----------+---------
data | jsonb | | |
Indexes:
"t3_index" gin ((data -> 'key'::text))
当我使用key
查询时,PostgreSQL正在进行序列扫描。
psql_eth=> explain (analyze, buffers) select * from t3 where data->>'key'='ZGJVcGdyYWRlXzIwMTcwNzE0ZGVkdXBsaWNhdGVEYXRh';
QUERY PLAN
----------------------------------------------------------------------------------------------------
Seq Scan on t3 (cost=0.00..4201.65 rows=377 width=289) (actual time=0.017..42.976 rows=1 loops=1)
Filter: ((data ->> 'key'::text) = 'ZGJVcGdyYWRlXzIwMTcwNzE0ZGVkdXBsaWNhdGVEYXRh'::text)
Rows Removed by Filter: 75049
Buffers: shared hit=3142
Planning time: 0.068 ms
Execution time: 42.996 ms
(6 rows)
答案 0 :(得分:1)
jsonb的默认GIN运算符类支持使用顶级键存在运算符的查询?,?&和?|运算符和路径/值存在运算符@>。
索引不适用于等于运算符(=)。您可以使用简单的btree索引:
create index on t3 ((data->>'key'));