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 索引高效和快速。您将需要试验您的数据和查询,看看哪个表现更好。