PostgreSQL 中 JSON 与 JSONB 的区别
JSON 和 JSONB 是 PostgreSQL 提供的两种 JSON 数据类型。JSON 存储的是原始 JSON 文本,保留格式(空格、键顺序等),写入速度快但查询效率较低。JSONB 以二进制格式存储,解析后丢弃格式信息,写入时需额外处理但支持索引、查询性能更高。
性能对比
JSON 适合频繁写入且很少查询的场景,例如日志记录。JSONB 适合需要复杂查询、索引或更新的场景,例如配置存储或动态数据结构。JSONB 的查询速度通常比 JSON 快 5-10 倍,尤其在大型文档上。
索引支持差异
JSONB 支持 GIN 索引,可加速路径查询和全文搜索。例如对 JSONB 字段创建 GIN 索引后,@> 和 ? 操作符的性能显著提升。JSON 类型无法直接创建功能性索引,只能对整个字段创建普通索引。
-- JSONB GIN 索引示例
CREATE INDEX idx_gin_data ON table USING GIN (jsonb_column);
操作符与函数兼容性
两种类型大部分操作符通用,但 JSONB 有额外优化:
->获取 JSON 对象字段(返回 JSON/JSONB)->>获取 JSON 对象字段(返回 text)@>检查左侧是否包含右侧(仅 JSONB 高效)?检查键是否存在(仅 JSONB 高效)
项目选型建议
需要频繁更新或查询 JSON 内容时选择 JSONB,例如:
- 用户个性化配置存储
- 半结构化数据分析
- 动态表单数据存储
仅需存储且很少查询的场景可考虑 JSON,例如:
- 审计日志记录
- 第三方 API 原始响应存储
- 历史数据存档
混合使用策略
对既有存储需求又有查询需求的场景,可组合使用:
-- 原始数据用 JSON 存储,提取的查询字段用 JSONB
CREATE TABLE events (
raw_json JSON,
queryable_data JSONB GENERATED ALWAYS AS (raw_json::jsonb) STORED
);
版本兼容性说明
JSON 类型从 PostgreSQL 9.2 开始支持,JSONB 在 9.4 引入。使用 JSONB 需确保生产环境版本 ≥ 9.4。较新版本(14+)对 JSONB 增加了更多优化,如 JSONB 路径查询的 SQL/JSON 标准支持。
384

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



