我需要将JSON文件存储到RDS中。
我们已经在我的SQL中尝试过了,但是基于JSON字段的筛选或从Mysql显示JSON字段都不起作用。
在迁移到NOSQL之前,这对我们来说是非常昂贵的,我们想检查Postgres是否能够以良好的性能处理这一问题。
例如,假设表中的值低于
id | name | age | more_info
----+--------+-----+---------------------------------------------------
1 | Thomas | 22 | {"email": "thom22@gmail.com", "country": "US"}
2 | Jerry | 24 | {"email": "jerrybac@gmail.com", "country": "UK"}
3 | Annie | 21 | {"email": "anniehan@ymail.com", "country": "AUS"}如果我们想要查询id,名字,年龄,more_info.country是可能的吗?我们能在这个表中索引more_info吗?
根据专家经验,建议将Postgres用于JSON。我们确实有两个列,它们将是jsonb类型。
该表中记录的数量更多--超过20亿。
发布于 2021-03-19 15:47:21
您可以以不同的方式查询特定国家,它们需要不同的索引来加快搜索速度(我假设该列被定义为jsonb)。
您可以在整个JSON值上创建GIN索引:
create index on the_table using gin(more_info jsonb_path_ops);上面的索引可以支持包含操作符@>。
因此,以下查询可以使用该索引:
select *
from the_table
where more_info @> '{"country": "AUS"}'
select *
from the_table
where more_info @> '{"email": "thom22@gmail.com"}'或者,使用操作符类jsonb_ops可以使用支座更多的操作符,但速度要慢一些。
与B树索引相比,GIN索引更大,维护速度更慢。如果您知道要查询的特定键,则该键上的B树索引可能更有效:
create index on the_table using gin( (more_info ->> 'country') );以下查询可以使用该索引:
select *
from the_table
where more_info ->> 'country' = "AUS";请注意,此方法要求您要查询的每个键都有一个索引。而GIN索引可以支持任何使用@>的查询。
由于GIN索引是一个支持多种表达式的“多用途”索引,它可能不如专用的B树索引高效和快速。您将需要对您的数据和查询进行实验,以查看哪些性能更好。
https://stackoverflow.com/questions/66711184
复制相似问题