在JSONB列上添加GIN索引会减慢我的请求

我来自Mysql和nosql数据库,并且是Postgres db的新手。 我正在Aurora AWS上使用Postgres 11.6。

我试图创建由两列,一个键和一个json值组成的表。 每个值如下所示:

{"game": "game6",
   "username": "Djobi",   
   (bunch of fields)
   "permissions": ["permission3", "permission1", "permission5"]}

我试图添加不同的索引,以查看数据库的容量。其中之一就是通过用户名查找用户。另一个是找到具有特定权限的用户。

 account_index   | account_index_username    | CREATE INDEX account_index_username ON public.account_index USING btree (((value -> 'username'::text)))
 account_index   | account_index_permissions | CREATE INDEX account_index_permissions ON public.account_index USING gin (((value -> 'permissions'::text)))
 account_index   | account_global_gin        | CREATE INDEX accountgin ON public.account_index USING gin (value)

我有两个表,数据完全相同。每个表大约有3000万行。一个带索引,一个不带索引。我正在运行以下查询以测试性能:

SELECT 1 
FROM account_noindex 
WHERE value @> '{"permissions": ["permission1"]}' limit 10;

我在这里尝试查找具有权限1的用户。 (旁注,尚不确定如何询问如何明确拥有权限1和任何包含权限1的权限) 在索引表上运行请求时,响应时间为5000ms。 在非索引表上运行请求时,响应时间为50 ms。

因此,非索引表比索引表快100倍,这不得不说使我感到困惑。 如果我尝试对这两个查询进行解释,则会得到以下结果:

索引表:

Limit  (cost=430.49..468.31 rows=10 width=32)
   ->  Bitmap Heap Scan on account_index  (cost=430.49..144146.44 rows=37999 width=32)
         Recheck Cond: (value @> '{"permissions": ["permission1"]}'::jsonb)
         ->  Bitmap Index Scan on accountgin  (cost=0.00..420.99 rows=37999 width=0)
               Index Cond: (value @> '{"permissions": ["permission1"]}'::jsonb)
(5 rows)

非索引表

Limit  (cost=0.00..1935.23 rows=10 width=4)
   ->  Seq Scan on account_noindex  (cost=0.00..7360637.42 rows=38035 width=4)
         Filter: (value @> '{"permissions": ["permission1"]}'::jsonb)

如果我尝试在偏移量上更深入(100k以上),则差异不太明显,但非索引表仍然更快。

那我在这里想念什么?我的GIN索引创建不正确吗?还是我的请求做错了? 请注意,我的用户名索引存在相同的问题。如果我只有GIN索引,我会得到非常奇怪的结果。当我添加BTREE索引时,就没有问题。