PostgreSQL中JSONB的索引

    JSONB类型的列上可以直接建索引,支持BTree索引和GIN索引。其中,GIN索引可以高效的从JSONB内部的key/value对中搜索数据,因此JSONB类型上常用GIN索引。

     JSONB上创建GIN索引的方式有两种:

  (1)使用默认的jsonb_ops操作符创建。

  (2)使用jsonb_path_ops操作符创建。

    两者的区别是:

  (1)jsonb_ops的GIN索引中,JSONB数据中的每个key和value都是作为一个单独的索引项。

  (2)jsonb_path_ops只为每一个value创建一个索引项。

    例如,一个项{“foo”:{"bar":"baz"}},jsonb_ops会分别为“foo”,"bar","baz"创建索引项,共创建了三个。jsonb_path_ops则是把“foo”,"bar","baz"组合成一个hash值作为索引项。因此,通常jsonb_path_ops的索引较小。

1.建表

create table test2(
  id int,
  doc jsonb
);

2.插入数据

insert into test2 select id,doc::jsonb from test;

  注:test表是上文《PostgreSQL中JSON的索引》中创建的表,此处复制了test表中的数据。

3.建索引

  使用默认的jsonb_ops操作符创建索引。

create index idx_test2 on test2 using gin(doc);

  使用jsonb_path_ops操作符创建索引。

create index idx_test2 on test2 using gin(doc jsonb_path_ops);

4.查看索引大小

select pg_indexes_size('test2');

  jsonb_ops下的执行结果:

  jsonb_path_ops下的执行结果:

   jsonb_path_ops类型的索引比jsonb_ops的小。

5.执行计划

explain analyze verbose select * from test2 where doc @> '{"company":"gdz"}';

jsonb_ops下的执行结果:

 jsonb_path_ops下的执行结果:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL ,`JSONB` 和 `text` 是两种不同的字段类型,分别用于存储不同类型的数据。 1. 存储方式: - `JSONB` 类型对 JSON 数据进行解析、验证和优化存储。它使用二进制格式存储 JSON 数据,以提高查询和索引的性能。JSONB 类型支持所有 JSON 数据类型,包括对象、数组、字符串、数字、布尔值和 null。 - `text` 类型是用于存储任意文本数据的一种通用类型。它不会对数据进行解析或验证,只是简单地将文本数据存储为字符串。 2. 查询和操作: - `JSONB` 类型提供了专门针对 JSON 数据的查询和操作函数,例如 `jsonb_extract_path`、`jsonb_array_length` 等。这些函数可用于从 JSONB 字段提取特定的值、搜索特定的键或值,以及对 JSON 数据进行修改和更新。 - `text` 类型在操作时需要使用通用的字符串函数,如 `LIKE`、`SUBSTRING` 等。这些函数无法直接处理 JSON 数据结构,需要自行编写解析逻辑。 3. 索引和性能: - `JSONB` 类型支持 GIN(Generalized Inverted Index)索引,可以加速 JSON 数据的查询。GIN 索引可以在 JSON 字段上进行全文搜索、键值搜索等操作,提高查询性能。 - `text` 类型可以使用通用的 B-tree 索引,但无法对 JSON 数据进行特定的索引优化。 综上所述,如果需要存储和操作 JSON 数据,并且需要高效的查询性能和索引支持,推荐使用 `JSONB` 类型。如果只是存储和展示普通的文本数据,可以使用 `text` 类型。 希望能解答你的问题!如有其他疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值