龙空技术网

PostgreSQL json索引实践:检索(存在、包含、等值、范围等)加速

开源那些事儿 263

前言:

眼前你们对“json_numeric_check”可能比较关心,姐妹们都需要剖析一些“json_numeric_check”的相关内容。那么小编也在网络上汇集了一些有关“json_numeric_check””的相关资讯,希望我们能喜欢,姐妹们快快来了解一下吧!

标签

PostgreSQL , json , gin , rum

背景

用户在使用JSON类型时,常见的一些JSON搜索包括:

1、存在,JSON中是否存在某个KEY,某些KEY,某些KEY的任意一个

存在某个KEY(TOP LEVEL)

1、存在,JSON中是否存在某个KEY,某些KEY,某些KEY的任意一个

存在某个KEY(TOP LEVEL)

存在所有KEY

存在任意KEY、元素

2、等值,JSON中是否存在指定的key:value对(支持嵌套JSON)

3、包含,JSON中某个路径下的VALUE(数组)中,是否包含指定的所有元素。

4、相交,JSON中某个路径下的VALUE(数组)中,是否包含指定的任意元素。

或(注意1,2,3需要双引号,作为text类型存储,因为操作符?| ?&暂时只支持了text[],如果是numeric匹配不上)

5、范围查找,JSON中某个路径下的VALUE,是否落在某个范围内。

这些操作如何加速,或者如何使用索引加速?

一、json 索引支持

GIN的两个OPS,分别支持JSON:

1、支持 @> 操作符的索引如下(jsonb_path_ops只支持@>操作符,但是效率高)

2、支持除范围查询以外的所有查询的索引如下

二、JSON KEY VALUE值范围查询加速

某些使用,需要对VALUE使用范围查询,比如时间(如果要建索引,请使用numeric表示,否则需要自定义immutable函数),数值都有这些需求。

通常的做法,把范围查询的类型提取出来,创建btree表达式索引,如果有任意组合的范围查询,使用gin或rum表达式索引。

例子

三、索引使用例子

标签: #json_numeric_check