Aurora Postgres 与 Aurora Mysql 中的字符串 JSON 文档
String JSON docs in Aurora Postgress vs Aurora Mysql
我需要将 JSON 文件存储到 RDS。
我们已在我的 SQL 中尝试过,但基于 JSON 字段的过滤或显示来自 Mysql 的 JSON 字段不起作用。
在转向 NOSQL 之前,我们想检查一下 Postgres 是否能够以良好的性能处理这个问题。SQL 这对我们来说成本很高。
例如,假设我们在 table
中的值低于
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,name,age,more_info.country可以吗?
我们可以在 table 中索引 more_info 吗?
根据专家经验,建议将 Postgres 用于 JSON。
我们确实有两列,它们将是 jsonb 类型。
此 table 中的记录数超过 20 亿条。
您可以通过不同的方式查询特定国家/地区,它们将需要不同的索引来加快搜索速度(我假设该列定义为 jsonb
)
可以在整个JSON值上创建GIN索引:
create index on the_table using gin(more_info jsonb_path_ops);
以上索引可以支持contains运算符@>
因此以下查询可以使用该索引:
select *
from the_table
where more_info @> '{"country": "AUS"}'
select *
from the_table
where more_info @> '{"email": "thom22@gmail.com"}'
或者使用运算符class jsonb_ops
可以使用supports个运算符,但是速度有点慢。
与 B-Tree 索引相比,GIN 索引更大且维护起来更慢。如果您知道要查询的特定键,该键上的 B-Tree 索引可能更有效:
create index on the_table using gin( (more_info ->> 'country') );
该索引可以被以下查询使用:
select *
from the_table
where more_info ->> 'country' = "AUS";
请注意,此方法要求您要查询的每个键都有一个索引。而 GIN 索引可以支持任何使用 @>
.
的查询
由于 GIN 索引是支持多种表达式的“多用途”索引,因此它可能不如专用 B-Tree 索引高效和快速。您将需要试验您的数据和查询,看看哪个表现更好。
我需要将 JSON 文件存储到 RDS。
我们已在我的 SQL 中尝试过,但基于 JSON 字段的过滤或显示来自 Mysql 的 JSON 字段不起作用。
在转向 NOSQL 之前,我们想检查一下 Postgres 是否能够以良好的性能处理这个问题。SQL 这对我们来说成本很高。
例如,假设我们在 table
中的值低于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,name,age,more_info.country可以吗? 我们可以在 table 中索引 more_info 吗?
根据专家经验,建议将 Postgres 用于 JSON。 我们确实有两列,它们将是 jsonb 类型。
此 table 中的记录数超过 20 亿条。
您可以通过不同的方式查询特定国家/地区,它们将需要不同的索引来加快搜索速度(我假设该列定义为 jsonb
)
可以在整个JSON值上创建GIN索引:
create index on the_table using gin(more_info jsonb_path_ops);
以上索引可以支持contains运算符@>
因此以下查询可以使用该索引:
select *
from the_table
where more_info @> '{"country": "AUS"}'
select *
from the_table
where more_info @> '{"email": "thom22@gmail.com"}'
或者使用运算符class jsonb_ops
可以使用supports个运算符,但是速度有点慢。
与 B-Tree 索引相比,GIN 索引更大且维护起来更慢。如果您知道要查询的特定键,该键上的 B-Tree 索引可能更有效:
create index on the_table using gin( (more_info ->> 'country') );
该索引可以被以下查询使用:
select *
from the_table
where more_info ->> 'country' = "AUS";
请注意,此方法要求您要查询的每个键都有一个索引。而 GIN 索引可以支持任何使用 @>
.
由于 GIN 索引是支持多种表达式的“多用途”索引,因此它可能不如专用 B-Tree 索引高效和快速。您将需要试验您的数据和查询,看看哪个表现更好。