PostgreSQL没有对JSONB上的GIN索引使用索引扫描

时间:2018-01-25 11:47:00

标签: postgresql indexing jsonb

我在PostgreSQL中有一个包含一个JSONB列的表。 JSON看起来像这样 - {'key':some_key, 'value': some_value} 我使用 -

在JSON中索引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)
  1. 为什么PostgreSQL正在进行seq扫描?
  2. 如何更快地提高查询结果?如何使用GIN索引?

1 个答案:

答案 0 :(得分:1)

来自the documentation:

  

jsonb的默认GIN运算符类支持使用顶级键存在运算符的查询?,?&和?|运算符和路径/值存在运算符@>。

索引不适用于等于运算符(=)。您可以使用简单的btree索引:

create index on t3 ((data->>'key'));