PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索
引言
PostgreSQL的JSONB数据类型非常灵活,提供了一套操作符来操作JSON数据。本指南将引导您创建一个包含JSONB数据的表,演示各种JSONB操作符,并讨论如何使用倒排索引和部分索引来优化性能。
理解PostgreSQL中的JSONB
JSONB,即JSON Binary,是PostgreSQL中的一种数据类型,用于以二进制格式存储JSON数据。与JSON数据类型不同,JSONB不是以纯文本形式存储的。相反,它被解析并存储为二进制表示,这带来了几个优点:
- 高效存储:二进制格式减少了存储空间,特别适用于大型数据集。
- 快速访问和操作:由于其预解析的特性,JSONB使得读写操作更快。
- 丰富的查询支持:JSONB支持高级查询能力,允许复杂数据操作,这在使用普通JSON时会很麻烦。
创建包含JSONB的表
首先,让我们创建一个示例表来存储包含JSONB列的产品信息:
CREATE TABLE products (id SERIAL PRIMARY KEY,name TEXT NOT NULL,attributes JSONB
);
JSONB操作符示例
我们将为表填充一些数据,并使用各种操作符来操作和查询这些数据。以下是带有JSONB操作符示例的表格:
-- 插入一些示例数据
INSERT INTO products (name, attributes) VALUES
('Smartphone', '{"brand": "TechCorp", "model": "X1000", "features": ["5G", "OLED display"]}'),
('Laptop', '{"brand": "ComputeInc", "model": "L200", "features": ["SSD", "16GB RAM"]}');-- JSONB操作符示例表
操作符 | 分类 | 描述 | 示例 |
---|---|---|---|
@> | 包含 | 检查左侧JSONB是否包含右侧JSONB。 | SELECT * FROM products WHERE attributes @> '{"brand": "TechCorp"}'; |
<@ | 包含 | 检查右侧JSONB是否包含左侧JSONB。 | SELECT * FROM products WHERE '{"brand": "TechCorp"}' <@ attributes; |
? | 存在 | 检查JSONB对象中是否存在某个键。 | SELECT * FROM products WHERE attributes ? 'features'; |
?| | 存在 | 检查数组中的任意一个键是否存在于JSONB对象中。 | SELECT * FROM products WHERE attributes ?| array['brand', 'model']; |
?& | 存在 | 检查数组中的所有键是否存在于JSONB对象中。 | SELECT * FROM products WHERE attributes ?& array['brand', 'model']; |
-> | 路径导航 | 通过键提取JSON对象。 | SELECT attributes->'brand' FROM products; |
->> | 路径导航 | 通过键以文本形式提取JSON对象。 | SELECT attributes->>'brand' FROM products; |
#> | 路径导航 | 通过路径提取JSON对象。 | SELECT attributes#>'{features, 0}' FROM products; |
#>> | 路径导航 | 通过路径以文本形式提取JSON对象。 | SELECT attributes#>>'{features, 0}' FROM products; |
|| | 连接 | 连接两个JSONB对象。 | UPDATE products SET attributes = attributes || '{"availability": "in stock"}'; |
- | 删除 | 从JSONB对象中删除一个键。 | UPDATE products SET attributes = attributes - 'model'; |
#- | 删除 | 从JSONB对象中删除一个路径。 | UPDATE products SET attributes = attributes #- '{features, 0}'; |
JSONB与多级嵌套
JSONB不仅允许存储简单的键值对,还支持复杂的嵌套结构。这意味着你可以在JSONB字段中包含对象、数组,以及数组中的对象等等。这样的结构非常适合表示复杂的数据关系,例如产品的规格、用户的层级信息等。
多级嵌套结构的访问
在JSONB中处理多级嵌套数据时,PostgreSQL提供了强大的路径操作符#>
,帮助我们从复杂的结构中提取特定的值。让我们通过一个示例来理解这一点。
示例:复杂的产品规格
假设我们有一个products
表,其中的attributes
列存储了产品的详细规格信息,结构如下:
{"productInfo": {"id": 101,"name": "Smartphone","specifications": {"dimensions": {"weight": "180g","height": "150mm","width": "70mm"},"performance": {"processor": "Octa-core","RAM": "6GB"}}},"availability": "In Stock"
}
如何访问多级嵌套数据
-
提取产品名称
要提取
productInfo
中的name
字段,可以使用如下SQL查询:SELECT attributes#>'{productInfo, name}' FROM products;
-
提取产品重量
如果需要访问
specifications
中的dimensions
部分的weight
信息,SQL查询如下:SELECT attributes#>'{productInfo, specifications, dimensions, weight}' FROM products;
-
获取处理器类型
要提取嵌套在
performance
中的processor
信息:SELECT attributes#>'{productInfo, specifications, performance, processor}' FROM products;
性能优化与索引
-
理解PostgreSQL中的索引
PostgreSQL中的索引是用于提高数据检索操作速度的数据结构。它们通过创建一个额外的结构,使数据库引擎能够快速找到满足给定条件的行。然而,索引也引入了权衡,因为它们需要额外的空间,并可能会在写操作(如INSERT、UPDATE、DELETE)时减慢速度,因为索引必须随着数据的变化而更新。 -
JSONB的倒排索引(GIN索引)
GIN(通用倒排索引)对于JSONB尤其有效,因为它允许对JSONB数据中的各个键和值进行索引。这使得它适用于需要在JSONB列中搜索特定键值对的查询。CREATE INDEX idx_products_attributes ON products USING gin (attributes);
这个索引将提高使用包含操作符(如
@>
)的查询的性能,通过快速定位相关行。 -
特定字段的部分索引
部分索引是一个强大的工具,可以优化基于特定条件进行过滤的查询。它们仅包含满足给定条件的数据子集,从而导致较小的索引大小和较快的针对这些条件的查询时间。CREATE INDEX idx_products_techcorp ON products USING gin (attributes) WHERE attributes->>'brand' = 'TechCorp';
这个部分索引专注于品牌为"TechCorp"的产品,增强了针对这部分数据的查询性能。
结论
PostgreSQL的JSONB操作符提供了一个强大的框架来管理JSON数据,并且通过战略性地使用索引,可以显著提高查询性能。通过利用倒排索引和部分索引,您可以优化PostgreSQL数据库以实现高效的数据检索,确保您的应用程序具有高性能。
相关文章:
PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索
引言 PostgreSQL的JSONB数据类型非常灵活,提供了一套操作符来操作JSON数据。本指南将引导您创建一个包含JSONB数据的表,演示各种JSONB操作符,并讨论如何使用倒排索引和部分索引来优化性能。 理解PostgreSQL中的JSONB JSONB,即JS…...
tornado,flaskd这两个框架主要是干什么的
Tornado是一个Python的Web框架,主要用于构建高性能的异步Web应用程序。它基于非阻塞的网络I/O模型,可以处理大量并发连接,适用于需要处理实时性要求较高的应用场景,如实时聊天、实时数据推送等。 Flask是另一个Python的Web框架&a…...

Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导
Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导 Sigrity除了可以进行交流噪声分析,同样也可以进行压降仿真分析,以下图为例. 3D view...
国产游戏技术能否引领全球?
国产游戏技术能否引领全球? 引言 近年来,中国游戏产业如同春天的嫩芽,迅速成长为全球最大的市场之一。或许你会想,国内的游戏开发者到底在技术上取得了多大的成就?这些成就又能否推动中国游戏走向世界,甚…...
【前端】在 Next.js 开发服务器中应该如何配置 HTTPS?
在 Next.js 的开发环境中,默认情况下是使用 HTTP 协议的。但是,您可以通过一些配置来启用 HTTPS。这在开发阶段可能很有用,尤其是在需要测试涉及安全传输的应用场景时。 下面是如何在 Next.js 开发环境中配置 HTTPS 的步骤: 方法…...

基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)
基于深度学习算法的动物检测系统(含PyQt代码训练数据集) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现五、讨论5.1 模型优缺点分析5.2 实验意义 参考资料 前言 本项目是基于Mobil…...

微信小程序美团点餐
引言:外卖已经成为了都市人的必备,在无数个来不及(懒得)做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊,它的很多功能与设计都值得我们学习。本文将从五个方面,对美团外卖展开产品分析…...

音频剪辑还花钱?2024年这4款免费工具让你告别烦恼
音乐迷们!是不是还在为找个音频剪辑软件就得花钱这事儿头疼呢?别急,2024年有好几个既免费又特别给力的音频剪辑免费的小帮手来了,保证帮你省下这笔钱,还让你用得爽歪歪!来来来,让我给你们介绍4个…...

【YOLO模型】(4)--YOLO V3超超超超详解!!!
文章目录 YOLO V3一、改进二、三种scale三、残差连接四、核心网络结构1. 结构2. 输出与先验框关系 五、softmax层替代 总结 YOLO V3 YOLO V3是由Joseph Redmon等人在2018年推出的一款目标检测算法。作为YOLO系列的第三代版本,它在实时性和准确性上取得了显著的提升…...
管理类联考 信息整理和经验分享
说明:大家在准备读MBA之前,肯定会去百度下MBA的相关常识,然而一上某度 你就发现 各种广告、各种培训机构 铺天盖地而来,想了解一些有价值的信息都有些困难,因此这些我在这里做了一些整理,方便准备参加 MBA …...

JetBrains IDE中GPU进程(JCEF)重启问题(Too many restarts of GPU-process)解决方案
目录 前言1. GPU进程重启问题概述1.1 什么是GPU进程重启问题?1.2 该问题带来的影响 2. GPU进程重启问题的原因分析2.1 显卡驱动的兼容性问题2.2 系统资源的限制2.3 JCEF组件的设置不合理 3. 解决方案3.1 方法一:通过自定义属性禁用GPU加速3.2 方法二&…...

《泛基因组:高质量参考基因组的新标准》
摘要 随着三代测序技术的进步和高质量参考基因组的发布,研究者们发现单一个体的参考基因组无法全面代表整个物种的遗传序列。这一现象导致了群体遗传变异图谱的不完整。为了解决这一问题,构建来自多个个体的泛基因组成为一种有效的方法。 泛基因组研究…...

模型其他压缩方法
文章目录 模型蒸馏模型剪枝除了模型量化之外,下面再介绍两种常见的模型压缩方法,即模型蒸馏和模型剪枝。与模型量化不同,模型蒸馏和模型剪枝则通过精简模型的结构,进而减少参数的数量。 不同表示精度的模型性能对比 模型蒸馏 模型蒸馏(ModelDistillation)的目标是将复杂…...

Python学习的自我理解和想法(22)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第22天,学的内容是正则表达式,明天会出一篇详细实例介绍。电脑刚修好!开学了,时间不多&…...
基于neo4j的糖尿病知识图谱数据
基于Neo4j的糖尿病知识图谱项目:毕业设计必备💡 这个项目,专为需要深入挖掘医学或AI数据的朋友们量身定制,尤其适合用于毕业设计!如果你对图谱构建、AI问答系统、或者正在学习Neo4j,那么你不得不看看这个技…...

分布式搜索引擎elasticsearch操作文档操作介绍
1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,…...

C++ 中的可调用对象
目录 一.可调用对象简介 1.什么是可调用对象? 2.可调用对象有什么用? 二.函数指针和仿函数 1.函数指针 a.函数指针的使用语法 b.函数指针的应用场景 2.仿函数 a.仿函数的基本概念 b.仿函数的优点 三.lambda表达式和function 1.lambda表达式 …...
[HBase]二 HBase原生Shell命令大全
HBase原生Shell命令汇总 1. General组 5 1.1. 查看集群状态:status 5 1.2. 查看表的操作方法:table_help 5 1.3. 查看HBase的版本信息:version 5 1.4. 查看当前用户:whoami 5 2. Namespace组 5 2.1. 创建命名空间:create_namespace 5 2.2. 显示命名空…...

Kafka之消费者客户端
1、历史上的二个版本 与生产者客户端一样,在Kafka的发展过程当中,消费者客户端主要有两个大的版本: 旧消费者客户端(Old Consumer):基于Scala语言开发的版本,又称为Scala消费者客户端。新消费…...

使用Python进行数据分析入门
文章目录 Python环境搭建安装Anaconda验证安装 必备库介绍NumPyPandasMatplotlibSciPy 数据导入与清洗导入数据清洗数据 数据探索与分析描述性统计相关性分析 数据可视化绘制直方图 高级主题机器学习深度学习 总结 随着大数据时代的到来,数据分析变得越来越重要。Py…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...