Skip to content
HeZzz
Go back

What is JSONB in PostgreSQL?

PostgreSQL 是一个强大的对象关系数据库管理系统,擅长处理结构化和半结构化数据,尤其是在支持 JSONB 方面。JSONB(二进制 JSON)允许高效地存储和查询 JSON 数据,使其成为需要快速访问结构化信息的应用程序的理想选择。

在本文中,我们将详细解释 JSONB,说明如何操作它,并通过实际示例解释 JSONB 在 PostgreSQL 中的重要性。

关于 JSON 请看: JavaScript JSON

什么是 JSONB?

创建和插入 JSONB 数据

让我们创建一个使用 JSONB 管理产品信息的数据库。你可以使用 ::jsonb 类型转换将数据插入 JSONB 列。以下是向 products 表插入产品信息的方法。 name 列存储值 ’ Smartphone ’ 。

CREATE TABLE products (
    id serial PRIMARY KEY,
    name text,
    details jsonb
);

INSERT INTO products (name, details)
VALUES
    ('Smartphone', '{"features": {"camera": "12MP", "battery": "4000mAh"}, "tags": ["electronics", "mobile"]}'::jsonb);

输出:

idnamedetails
1Smartphone{“features”: {“camera”: “12MP”, “battery”: “4000mAh”}, “tags”: [“electronics”, “mobile”]}

关键操作符与函数

JSON 和 JSONB 在 PostgreSQL 中支持多种函数和操作符,以执行多种操作和功能。一些常见操作符包括:

操作符/函数作用示例
->通过键提取 JSON 对象(返回 jsonb 类型)details->'features'
->>通过键提取文本值(返回 text 类型)details->>'brand'
@>包含检查:判断左操作数是否包含右操作数(支持嵌套结构)details @> '{"features": {"ports": ["USB-C"]}}'
?存在检查:判断顶级键或数组元素是否存在tags ? 'qui'
#>通过路径提取子对象(如 {a,b}details#>'{features,camera}'

💡 注意@> 支持深度嵌套查询(如 {"tags": [{"term":"paris"}]}),而 ? 仅检查顶层键/元素。

性能优化:GIN 索引

JSONB 的核心性能依赖 GIN 索引,两种操作符类:

操作符类支持操作符适用场景优势/劣势
jsonb_ops (默认)@>, ?, ?&, @?, @@通用场景,需键存在性检查(?索引体积较大,查询灵活性高
jsonb_path_ops@>, @?, @@仅需包含/路径匹配(如 API 日志分析)索引体积小 30-50%,查询速度更快

创建索引示例

-- 默认操作符类
CREATE INDEX idx_default ON products USING GIN (details);

-- 优化路径查询(推荐多数场景)
CREATE INDEX idx_path ON products USING GIN (details jsonb_path_ops);

优化技巧


最佳实践


高级特性:jsonpath

🌰 示例

SELECT * FROM products 
WHERE details @@ '$.features.ports[*] == "USB-C"'; -- 比 @> 更灵活

在 PostgreSQL 18 和 PostgreSQL 12 中的区别

下标操作支持

PostgreSQL 18 新增了完整的 jsonb 下标操作支持,允许使用类似数组的语法直接访问和修改 jsonb 对象:

-- 提取对象值
SELECT ('{"a": 1}'::jsonb)['a'];

-- 修改 jsonb 值
UPDATE table_name SET jsonb_field['key'] = '1';

-- 嵌套访问
SELECT ('{"a": {"b": {"c": 1}}}'::jsonb)['a']['b']['c'];

PostgreSQL 12 完全没有此功能,这是两个版本间最显著的区别。

PL/Python 支持

这表明 PG 18 已完全放弃对 Python 2 的支持,只专注于 Python 3

Unicode 处理

索引优化方面


总结

JSONB 是 PostgreSQL 处理半结构化数据的王牌

避坑提示

  1. 非 UTF8 数据库慎用 Unicode 转义(\uXXXX)。
  2. 超大数字可能被截断(jsonbnumeric 类型存储,范围有限)。
  3. 索引选择需权衡:jsonb_path_ops 性能更优,但不支持 ? 操作符。

官方文档是终极指南PostgreSQL JSONB 文档(重点阅读 8.14.3 节与 8.14.4 节)。

适用场景:微服务配置中心、IoT 传感器数据、电商商品属性、实时日志分析。
性能基准:在 1000 万行数据中,GIN 索引将 @> 查询从秒级降至毫秒级。

参考资料


Share this post on:

上一篇
在 Spring Boot 2.x/3.x 开发中,JSON 数组参数校验失效原因及解决方案
下一篇
Java语言-2025fa-yy重点