我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL中如何使用jsonb数据类型

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL中如何使用jsonb数据类型

PostgreSQL中如何使用jsonb数据类型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

PostgreSQL 9.4 正在加载一项新功能叫jsonb,是一种新型资料,可以储存支援GIN索引的JSON 资料。换言之,此功能,在即将来临的更新中最重要的是,如果连这都不重要的话,那就把Postgres 置于文件为本数据库系统的推荐位置吧。

自从9.2开始,一个整合JSON 资料类型已经存在,带有一整套功能(例如资料产生和资料解构功能),还有9.3新增的操作者。当使用JSON 资料类型,资料的被存储成一完全一样的副本,功能还在此之上运作,还另外需要后台运作的重新分析。

这心得JSONB 资料类型以已降解的2元格式存储,所以,插入此资料会比JSON高效,因为后台不再需要重新分析,因此让它更快速运行,而且还兼顾GIN 索引。就是因为最后这个原因,我们实际上建议读者使用jsonb来代替json制作程式(当然你还可以因应需要而使用json)。请记住jsonb使用相同的操作者和功能,读者们可以看我之前的帖子去令你得到些什么启发(或者干脆看Postgres的文件)。
 

现在让我们看一下JSONB是如何工作的,同时和JSON比较一下。采用的测试数据是860万的geobase类型数据,大概1.1G大小,包括了城市名,国家代码(可以在这参见完整列表)等很多字段。首先通过底层复制(raw copy)来把这些数据存储到数据库的一个新表里面,之后把这张表通过一组填充因子是100的表转换成JSON/JSONB,之后来看它们各占多少空间。
 

=# COPY geodata FROM '$HOME/Downloads/allCountries.txt';
COPY 8647839
=# CREATE TABLE geodata_jsonb (data jsonb) with (fillfactor=100);
CREATE TABLE
=# CREATE TABLE geodata_json (data json) with (fillfactor=100);
CREATE TABLE
=# \timing
Timing is on.
=# INSERT INTO geodata_json SELECT row_to_json(geodata) FROM geodata;
INSERT 0 8647839
Time: 287158.457 ms
=# INSERT INTO geodata_jsonb SELECT row_to_json(geodata)::jsonb FROM geodata;
INSERT 0 8647839
Time: 425825.967 ms

生成JSONB数据花费稍微长一点时间,大小有没有区别呢?
 

=# SELECT pg_size_pretty(pg_relation_size('geodata_json'::regclass)) AS json,
     pg_size_pretty(pg_relation_size('geodata_jsonb'::regclass)) AS jsonb;
 json  | jsonb 
---------+---------
 3274 MB | 3816 MB
(1 row)

在JSON数据上面做索引从9.3版本开始,比如用操作符(注意 因为它返回文本,所以'->>'被采用;并且根据查询不同,索引采用不同的关键字)
 

=# CREATE INDEX geodata_index ON
  geodata_json ((data->>'country_code'), (data->>'asciiname'));
CREATE INDEX
=# SELECT pg_size_pretty(pg_relation_size('geodata_index'::regclass))
  AS json_index;
 json_index 
------------
 310 MB
(1 row)
=# SELECT (data->>'population')::int as population,
     data->'latitude' as latitude,
     data->'longitude' as longitude
  FROM geodata_json WHERE data->>'country_code' = 'JP' AND
    data->>'asciiname' = 'Tokyo' AND
    (data->>'population')::int != 0;
 population | latitude | longitude 
------------+----------+-----------
  8336599 | 35.6895 | 139.69171
(1 row)
=# -- Explain of previous query
                            QUERY PLAN                            
-------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on geodata_json (cost=6.78..865.24 rows=215 width=32)
  Recheck Cond: (((data ->> 'country_code'::text) = 'JP'::text) AND ((data ->> 'asciiname'::text) = 'Tokyo'::text))
  Filter: (((data ->> 'population'::text))::integer <> 0)
  -> Bitmap Index Scan on geodata_index (cost=0.00..6.72 rows=216 width=0)
     Index Cond: (((data ->> 'country_code'::text) = 'JP'::text) AND ((data ->> 'asciiname'::text) = 'Tokyo'::text))
 Planning time: 0.172 ms
(6 rows)

在这个例子里,计划(planner)可以使用bitmap索引扫描,同时使用了之前产生的索引。


现在,JSONB的一个新特点就是检查包含带有操作符@>的数据容量,这种数据是可以用GIN来索引的,这种操作符数据也包括了?,?|和?&(为了检查给定的关键字是否存在)。 GIN索引对两类操作符起作用:

    缺省操作符类,之前列出的四个;

    jsonb_hash_ops,仅支持@>,但是当搜索数据时性能表现不错,而且所占磁盘空间较小;

下面是它如何工作:
 

=# CREATE INDEX geodata_gin ON geodata_jsonb
   USING GIN (data jsonb_hash_ops);
CREATE INDEX
=# SELECT (data->>'population')::int as population,
   data->'latitude' as latitude,
   data->'longitude' as longitude
  FROM geodata_jsonb WHERE data @> '{"country_code": "JP", "asciiname": "Tokyo"}' AND
    (data->>'population')::int != 0;
 population | latitude | longitude 
------------+----------+-----------
  8336599 | 35.6895 | 139.69171
(1 row)
 =# SELECT pg_size_pretty(pg_relation_size('geodata_gin'::regclass)) AS jsonb_gin;
 jsonb_gin
-----------
 1519 MB
(1 row)
=# -- EXPLAIN of previous query
                   QUERY PLAN                   
-------------------------------------------------------------------------------------
 Bitmap Heap Scan on geodata_jsonb (cost=131.01..31317.76 rows=8605 width=418)
  Recheck Cond: (data @> '{"asciiname": "Tokyo", "country_code": "JP"}'::jsonb)
  Filter: (((data ->> 'population'::text))::integer <> 0)
  -> Bitmap Index Scan on geodata_gin (cost=0.00..128.86 rows=8648 width=0)
     Index Cond: (data @> '{"asciiname": "Tokyo", "country_code": "JP"}'::jsonb)
 Planning time: 0.134 ms

根据应用的需求,你或许想采用空间消耗低的索引,比如BTree建立在JSON数据上的索引类型;GIN索引有着更多的优点,因为它覆盖了所有的JSON字段,并且检查容量;

关于PostgreSQL中如何使用jsonb数据类型问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL中如何使用jsonb数据类型

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PostgreSQL中JSONB数据类型怎么使用

PostgreSQL中的JSONB数据类型JSONB(JSON二进制)是PostgreSQL中的一种内置数据类型,用于存储和查询JSON数据。它比传统的JSON数据类型更紧凑、更高效。JSONB提供强大的键值访问、路径查询和聚合功能,并支持索引以提高查询性能。虽然JSONB具有优点,但它也比传统JSON数据类型更复杂,需要对操作符和函数有深入了解。
PostgreSQL中JSONB数据类型怎么使用
2024-04-09

NoSQL中JSONB数据类型怎么使用

JSONB在NoSQL中的使用JSONB是一种NoSQL数据库数据类型,可存储具有动态模式的JSON文档。它提供灵活的数据建模、松散耦合、高效索引和扩展性。开发者可以使用JSONB插入、查询、更新和聚合文档,并通过选择性索引和多文档事务优化性能。虽然JSONB不支持关系查询,但它是一个强大的工具,可以构建可扩展且响应迅速的NoSQL应用程序。
NoSQL中JSONB数据类型怎么使用
2024-04-09

PostgreSQL中json数据类型怎么使用

这篇文章主要介绍“PostgreSQL中json数据类型怎么使用”,在日常操作中,相信很多人在PostgreSQL中json数据类型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL中
2023-07-05

PostgreSQL中json数据类型详解

目录前言一、PG数据库中jsON的类型1、json和jsonb的区别2、项目开发中的选择3、json数据类型二、PG中json的简单操作1、基础json数据操作2、json和jsonb输出对比3、jsonb包含测试总结前言
2023-04-01

Flex中如何使用Number数据类型

本篇文章为大家展示了Flex中如何使用Number数据类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Flex数据类型数据类型说明基元数据类型包括Boolean、int、Null、Number、S
2023-06-17

Redis中HyperLogLog数据类型如何使用

这篇文章主要讲解了“Redis中HyperLogLog数据类型如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis中HyperLogLog数据类型如何使用”吧!1. HyperL
2023-07-05

Java中如何使用复杂数据类型

本篇文章为大家展示了Java中如何使用复杂数据类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java复杂数据类型用法 (转)[@more@]同简单数据类型的定义一样,Java虚拟机(JVM)还定
2023-06-03

PHP中array复合数据类型如何使用

PHP中array复合数据类型如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1), array(数组) :PHP 中的数组实际上是把一个优化过的有序图类型当成数组来使
2023-06-17

编程热搜

目录