postgresql json和jsonb问题记录

jsonb会打乱原json属性顺序,但是支持索引

原json:

[{
        "ITEM": "W(nm)",
        "HZ1": 0,
        "HZ2": 0
    }, {
        "ITEM": "OL(nm)",
        "HZ1": 0,
        "HZ2": 0
    }, {
        "ITEM": "OR(nm)",
        "HZ1": 0,
        "HZ2": 0
    }
]
CREATE TABLE mc.test (
	id int8 GENERATED BY DEFAULT AS IDENTITY NOT NULL,
	json_detail jsonb NOT NULL
);

json类型保存数据库后:

[{"HZ1": 0, "HZ2": 0, "ITEM": "W(nm)"}, {"HZ1": 0, "HZ2": 0, "ITEM": "OL(nm)"}, {"HZ1": 0, "HZ2": 0, "ITEM": "OR(nm)"}]

改成json类型后:

CREATE TABLE mc.test (
	id int8 GENERATED BY DEFAULT AS IDENTITY NOT NULL,
	json_detail json NOT NULL
);

[{"ITEM":"W(nm)","HZ1":0,"HZ2":0},{"ITEM":"OL(nm)","HZ1":0,"HZ2":0},{"ITEM":"OR(nm)","HZ1":0,"HZ2":0}]

<think>嗯,用户问的是PostgreSQLJSONJSONB之间的差异。我需要先回顾一下这两个数据类型的区别。首先,JSONJSONB都是PostgreSQL用来存储JSON数据的类型,但它们的存储方式功能有所不同。 首先,JSON类型存储的是原始的JSON文本,也就是输入的内容会被完整保留,包括空格键的顺序。而JSONB则是以二进制格式存储,会对JSON进行解析,去除不必要的空格,并且不保留键的顺序,可能还会优化存储结构。这样的话,JSONB的写入速度可能会稍慢一些,因为需要转换,但查询速度会更快,因为不需要每次都解析文本。 然后是索引支持。JSONB支持GIN索引,这样可以加速各种查询操作,比如存在性检查或者路径查询。而JSON类型不支持这样的索引,所以查询效率可能较低。这点很重要,尤其是当数据量大时,索引能显著提升性能。 接下来是函数操作符的支持。两者都支持很多相同的操作符,比如->->>来提取元素,但JSONB可能有更多的操作符函数,比如包含操作符@>。需要确认具体支持哪些操作符,可能JSONB的功能更全面。 存储空间方面,JSONB通常会比JSON占用更多的磁盘空间,因为它存储了解析后的二进制格式,可能会有额外的元数据。不过,由于去除了空格重复的键,可能有时候反而更节省空间?这点可能需要查阅文档确认。例如,PostgreSQL的文档提到JSONB会消除重复键,只保留最后一个,而JSON会保留所有键,包括重复的。 另外,处理重复键时,JSON类型会保留所有的键,而JSONB只保留最后一个出现的键。这对于数据的一致性可能有影响,需要注意。 还有性能方面,JSONB的查询速度更快,因为数据已经被解析成二进制格式,而JSON每次查询都需要解析文本。但插入更新时,JSONB会有额外的转换开销,所以写入可能稍慢。 然后,用户提供的引用中有提到JSONBBSON的比较,其中引用[1]提到JSONBBSON的应用场景。引用[4]中的性能对比可能也相关,但具体内容需要结合来看,比如在插入数据加载方面,MongoDB胜出,但在某些查询存储大小上PostgreSQL更好。不过这可能更多是PostgreSQL与MongoDB的对比,而不是JSONJSONB的直接对比,不过可以辅助说明JSONB的优化效果。 需要确保回答的结构清晰,分点列出差异,并引用相关的资料。例如,存储方式、索引支持、处理重复键、性能差异、操作符支持等。同时,根据用户提供的引用,引用[1]提到JSONBBSON,可能可以指出JSONBPostgreSQL的二进制格式,类似于MongoDB的BSON,但实现不同。 可能还需要注意用户提供的示例中关于性能的部分,比如引用[4]中的测试数据,虽然主要是对比PGMongoDB,但可以侧面说明二进制格式(如JSONB)在查询时的性能优势。 最后,生成相关问题,比如如何选择JSONJSONB,如何优化JSONB的查询,索引创建方法,如何处理重复键等。</think>### JSONJSONBPostgreSQL中的差异 #### 1. **存储方式** - **JSON**: 存储原始文本格式的JSON数据,保留输入中的空格、键顺序重复键。写入时不做处理,直接存储字符串。 - **JSONB**: 存储解析后的二进制格式,去除空格、不保留键顺序,且自动消除重复键(仅保留最后一个值)[^1]。写入时需额外解析转换,但查询效率更高。 #### 2. **索引支持** - **JSON**: 不支持GIN索引,仅能通过表达式索引特定路径。 - **JSONB**: 支持GIN索引,可加速路径查询、存在性检查等操作。例如: ```sql CREATE INDEX idx_jsonb ON table USING GIN (jsonb_column); ``` #### 3. **性能差异** - **写入**: JSON的写入速度更快,因为无需解析;JSONB因需转换为二进制格式,写入稍慢。 - **查询**: JSONB的查询性能显著优于JSON,尤其是涉及复杂条件或索引时[^4]。例如,全表扫描场景中JSONB可能更快[^4]。 #### 4. **操作符与函数** - **JSON**: 支持基础操作符如`->`(提取键值)、`->>`(提取文本)。 - **JSONB**: 额外支持`@>`(包含)、`?`(键存在)等高级操作符,且能直接参与更多数据类型转换。 #### 5. **存储空间** - **JSON**: 占用空间与原始文本一致。 - **JSONB**: 通常占用更大空间(二进制元数据),但可能因消除重复键或压缩而更优。 #### 6. **应用场景** - **JSON**: 适合需保留原始格式(如日志记录)或频繁写入的场景。 - **JSONB**: 适合复杂查询、需要索引优化或频繁读取的场景。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值