PostgreSQL 教程:json 与 jsonb 类型的存储格式区别及可视化对比

PostgreSQL中JSON与JSONB对比

PostgreSQL 中 JSON 与 JSONB 类型的区别

PostgreSQL 提供了两种 JSON 数据类型:jsonjsonb。两者均可存储 JSON 格式数据,但在存储方式和处理性能上有显著差异。

存储格式差异:

  • json 类型以纯文本形式存储 JSON 数据,保留原始格式(包括空格、键顺序等),插入时仅做基本语法验证。
  • jsonb 类型以二进制格式存储,解析后重新排列键顺序、删除冗余空格,并建立优化后的索引结构。

核心对比:

特性jsonjsonb
存储方式原始文本(直接复制)解析后的二进制格式
写入速度更快(无转换开销)较慢(需解析和优化)
查询速度较慢(需实时解析)更快(支持索引和预优化)
存储空间较小(保留原始格式)较大(额外元数据开销)
键顺序保留保留不保留
重复键处理保留最后一次出现的键值仅保留最后一次出现的键值

可视化存储示例

假设插入以下 JSON 数据:

CREATE TABLE test_data (id serial, j json, jb jsonb);
INSERT INTO test_data (j, jb) VALUES (
  '{"name": "Alice", "age": 30, "active": true, "tags": ["a", "b"]}',
  '{"name": "Alice", "age": 30, "active": true, "tags": ["a", "b"]}'
);

内部存储表现对比:

  1. json 类型
    存储与输入完全一致的文本,包括空格和键顺序:

    {"name": "Alice", "age": 30, "active": true, "tags": ["a", "b"]}
    

  2. jsonb 类型
    存储为优化后的二进制,键可能重新排序(字母顺序),移除空格:

    {"active": true, "age": 30, "name": "Alice", "tags": ["a", "b"]}
    

操作差异示例

查询效率测试:

-- 对json类型查询(需实时解析)
EXPLAIN ANALYZE SELECT * FROM test_data WHERE j->>'name' = 'Alice';

-- 对jsonb类型查询(可利用索引)
CREATE INDEX idx_jb ON test_data USING gin (jb);
EXPLAIN ANALYZE SELECT * FROM test_data WHERE jb @> '{"name": "Alice"}';

修改数据:

-- jsonb支持直接操作符修改(9.5+版本)
UPDATE test_data SET jb = jb || '{"age": 31}'::jsonb WHERE id = 1;

-- json类型需完全替换
UPDATE test_data SET j = '{"name": "Alice", "age": 31}'::json WHERE id = 1;

如何选择类型

适用 json 的场景:

  • 需要保留原始 JSON 格式(如日志记录)。
  • 仅做存储且极少查询。

适用 jsonb 的场景:

  • 需要高频查询或修改 JSON 内容。
  • 需要创建 GIN 索引加速搜索。
  • 不关心键顺序或格式细节。

通过以上对比,可根据实际业务需求选择合适的数据类型。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值