PostgreSQL 中 JSON 与 JSONB 类型的差异
JSON 和 JSONB 是 PostgreSQL 中两种存储 JSON 数据的类型,但它们在存储方式和性能上有显著区别:
- JSON 类型以纯文本格式存储数据,保留原始格式(如空格、键顺序),插入时不做验证,查询时需要实时解析。
- JSONB 类型以二进制格式存储,解析后重新格式化,删除无关空格和重复键,支持索引,查询效率更高。
批量导入 JSON 与 JSONB 数据的操作案例
方法一:使用 COPY 命令导入
创建测试表并准备数据文件(如 data.json):
CREATE TABLE test_json (id SERIAL, data JSON);
CREATE TABLE test_jsonb (id SERIAL, data JSONB);
执行 COPY 命令导入:
COPY test_json (data) FROM '/path/to/data.json';
COPY test_jsonb (data) FROM '/path/to/data.json';
方法二:使用 INSERT 语句批量导入
通过数组构造批量插入:
INSERT INTO test_json (data) VALUES
('{"name": "Alice", "age": 30}'),
('{"name": "Bob", "age": 25}');
INSERT INTO test_jsonb (data) VALUES
('{"name": "Alice", "age": 30}'),
('{"name": "Bob", "age": 25}');
方法三:使用 pg_dump 和 pg_restore
对于大型数据集,先导出为自定义格式:
pg_dump -Fc -t test_table -f dump_file.dump dbname
恢复时指定格式转换:
pg_restore --data-only -j 4 -d new_db dump_file.dump
操作差异与注意事项
- 性能差异:JSONB 的导入速度通常比 JSON 慢,因为需要转换为二进制格式,但查询性能更好。
- 存储空间:JSONB 可能比 JSON 占用更多空间,但压缩效果更好。
- 索引支持:只有 JSONB 支持 GIN 索引,大幅提高查询效率:
CREATE INDEX idx_jsonb ON test_jsonb USING GIN (data);
实际应用示例
查询 JSONB 字段中的嵌套值:
SELECT data->'name' AS name FROM test_jsonb WHERE data @> '{"age": 30}';
更新 JSONB 字段内容:
UPDATE test_jsonb SET data = jsonb_set(data, '{age}', '31') WHERE data->>'name' = 'Alice';
最佳实践建议
- 需要频繁查询或更新的场景优先选择 JSONB
- 仅存储而不查询的简单场景可使用 JSON
- 大规模导入时考虑禁用触发器和索引以提高速度
- 对于超大数据集,建议分批导入并启用并行处理
PostgreSQL JSON与JSONB批量导入对比
1731

被折叠的 条评论
为什么被折叠?



