PostgreSQL 中 JSON 与 JSONB 的类型差异
PostgreSQL 提供了两种 JSON 数据类型:JSON 和 JSONB。它们在存储方式、性能和应用场景上有显著区别。以下是六大关键区别:
存储格式
JSON 类型以文本格式存储 JSON 数据,保留原始输入的完整内容(包括空格和键顺序),每次查询时需重新解析。
JSONB 以二进制格式存储,解析后的数据会被转换为更高效的内部表示形式,舍弃无关的空白字符和键顺序,查询时无需重复解析。
写入性能
JSON 的写入速度通常更快,因为数据不需要转换,直接以原始文本存储。
JSONB 的写入会有额外开销,需将 JSON 数据转换为二进制格式,但换来了更高效的查询性能。
查询性能
JSON 在查询时需要实时解析文本,性能较低,尤其对大型 JSON 数据或频繁查询的场景。
JSONB 的查询性能更高,二进制格式支持索引,能快速定位数据。适合需要频繁查询或修改的场景。
索引支持
JSON 类型不支持直接创建索引,只能通过函数索引(如 CREATE INDEX idx ON table_name USING gin ((json_column->'key'));)实现有限优化。
JSONB 原生支持 GIN(Generalized Inverted Index)索引,可高效查询嵌套结构或数组内容。例如:
CREATE INDEX idx ON table_name USING gin (jsonb_column);
数据修改
JSON 类型没有内置的修改函数,更新操作通常需要替换整个字段。
JSONB 提供了一系列操作符和函数(如 jsonb_set、jsonb_insert),支持局部修改:
UPDATE table_name
SET jsonb_column = jsonb_set(jsonb_column, '{path,to,key}', '"new_value"')
WHERE id = 1;
应用场景
JSON 适合存储不需要频繁查询或修改的日志类数据,或需要保留原始格式(如空格、键顺序)的场景。
JSONB 适合需要高效查询、索引支持或频繁修改的 JSON 数据,如用户配置、API 响应等动态结构。
示例对比
创建表并插入数据:
CREATE TABLE test_data (
id SERIAL PRIMARY KEY,
json_column JSON,
jsonb_column JSONB
);
INSERT INTO test_data (json_column, jsonb_column)
VALUES (
'{"name": "Alice", "age": 30, "tags": ["admin", "user"]}',
'{"name": "Alice", "age": 30, "tags": ["admin", "user"]}'
);
查询效率对比(使用 EXPLAIN ANALYZE):
-- JSON 查询(需实时解析)
EXPLAIN ANALYZE SELECT json_column->>'name' FROM test_data;
-- JSONB 查询(二进制直接访问)
EXPLAIN ANALYZE SELECT jsonb_column->>'name' FROM test_data;
选择建议
优先选择 JSONB 除非有明确需求保留原始文本格式。JSONB 的二进制存储和索引支持能显著提升复杂查询性能,尤其在数据量大的场景。

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



