当前位置: 首页 > 面试题库 >

JSON上的PostgreSQL索引

秦博延
2023-03-14
问题内容

我想使用Postgres 9.4 在json列上创建一个索引,该索引将在搜索列中的特定键时使用。

例如,我有一个带有json列“ animals”的“农场”表。

animals列具有通用格式的json对象:

'{"cow": 2, "chicken": 11, "horse": 3}'

我已经尝试了多个索引(分别):

(1) create INDEX animal_index ON farm ((animal ->> 'cow'));
(2) create INDEX animal_index ON farm using gin ((animal ->> 'cow'));
(3) create INDEX animal_index ON farm using gist ((animal ->> 'cow'));

我想运行如下查询:

SELECT * FROM farm WHERE (animal ->> 'cow') > 3;

并让该查询使用索引。

当我运行此查询时:

SELECT * FROM farm WHERE (animal ->> 'cow') is null;

那么(1)索引就可以了,但是我无法获得任何索引来解决不平等问题。

这样的索引可能吗?

农场表仅包含约5000个农场,但是其中一些包含100个动物,查询对于我的用例而言花费的时间太长。这样的索引是我可以想到的唯一加快查询速度的方法,但是也许还有另一种选择。


问题答案:

您的另外两个索引不能仅仅因为->>运算符 return text
而工作,而显然您要jsonb记住gin运算符类。请注意,您仅提及json,但实际上您需要
jsonb
高级索引功能。

为了制定出最佳的索引策略,您必须更仔细地定义要覆盖的查询。您只对奶牛感兴趣吗?还是所有动物/所有标签?哪些运营商是可能的?您的JSON文档是否还包含非动物密钥?这些怎么办?您是否要在索引中包括母牛(或其他人)根本不在JSON文档中显示的行?

假设:

  • 我们只对第一层筑巢的母牛感兴趣。
  • 该值始终是有效的integer
  • 我们对没有母牛的行不感兴趣。

我建议使用功能性btree索引,就像您已经拥有的一样,但是将值转换为整数。我不认为您希望对比较进行评估text(其中“ 2”大于“ 1111”)。

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int));  -- !

强制转换需要额外的括号集,以使索引表达式的语法明确。

在查询中使用相同的表达式,以使Postgres意识到索引适用:

SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;

对于 已知的,静态的,琐碎 的动物数量(如您所评论的),我建议使用部分索引,例如:

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;

CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;

等等。

您可能必须将索引条件添加到查询中:

SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND   (animal ->> 'cow') IS NOT NULL;

可能看起来很多余,但可能是必要的。测试ANALYZE



 类似资料:
  • 问题内容: 参考原始的stackoverflow问题,我试图将gin索引应用于Postgres 9.4中数组对象中的键,但没有得到第一个答案中所述的结果。 您能纠正错误吗? 我遵循的步骤已写在下面。 第1部分:创建表和索引 第2部分:查询 该查询给出空结果。 我也尝试使用GIN索引。 替代索引和查询: 问题答案: 原始答案中的这个特定jsonb示例缺少用于包含查询的非原始对象周围的数组层。此后已修

  • 索引是加速搜索引擎检索数据的一种特殊表查询。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。 拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。 索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。

  • 问题内容: 我正在使用postgres 9.4,我有以下查询: 返回以下关系: 我正在尝试编写相同的查询,但这样我就获得了项目代码,并将活动名称作为相对于每个“ pid”的json数组 所以我正在寻找一个查询,该查询将返回如下内容: 有任何想法吗?在此先感谢您的帮助 更新 这是我所做的(与Abelisto所说的很接近): 问题答案:

  • 问题内容: 我有对象的Postgres JSONB数组,看起来像这样: 此JSONB是一个函数参数。 什么是最有效的检索方法 。 我尝试过玩,但是到目前为止我所做的一切看起来都非常混乱。 问题答案: 在 Postgres 9.4+中 ,可以在横向 联接中 使用该函数: 您可以通过一个简单的函数来实现该想法,例如: 在 Postgres 12+中, 您可以使用jsonb路径函数的形式来替代: Db

  • 我有一个这样的json 我想在这个json中做ng重复。我有那些0 1索引,我不能删除。

  • PostgreSQL 提供了多种索引类型:B 树、hash、GiST 和 GIN,每种索引类型都有适合的应用场景,可以根据场景选择合适的索引以提高效率。 B 树 B 树适合相等判断和有序的区间查询,通常来说,经常使用这些查询时推荐使用 B 树索引: <、>、<=、>= 以及 =。 此外,对于判断字符串开头的 LIKE 和 ~ 查询也可以考虑使用 B 树索引。比如: col LIKE 'foo%'