PostgreSQL9.4 新增 JSONB 数据类型, JSONB 同时属于 JSON (JavaScript Object Notation) 数据类型,jsonb 和 json 的输入数据几乎完全通用,最大的差别体现在效率上,json 存储的数据几乎和输入数据一样,存储的是未解析的数据,调用函数时使用效率较低; 而 jsonb 存储的是分解的 binary 格式数据,使用时不需要再解析了,因此使用上效率较高; 另一方面 json 在写入时较快,而 jsonb 写入时由于需要转换导致写入较慢。下面通过些简单的例子了解两者的差异。
两个示例
这个例子两者没啥差异
1 |
francs=> SELECT '[1, 2, "foo", null]'::json; |
备注: json 类型输出的内容和写入的内容一样,不会对输出的结果改变,而 jsonb不一样,看下面的例子。
Jsonb: 输出内容顺序不一样
1 |
francs=> SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json; |
Jsonb: 整数类型输出不一样
1 |
francs=> SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb; |
Jsonb: 去掉了空格
1 |
francs=> select ' {"id":1, |
Jsonb: 重复元素值保留最后一个
1 |
francs=> select ' {"id":1, |
备注: json 类型的输出和输入一样,会保留所有重复的元素,而 jsonb 对于重复的元素仅保留最后出现的重复元素。
Jsonb/Json 索引
GIN 索引支持 jsonb 类型,支持大的 jsonb 表中基于 keys 或者 key/values 模式的检索。默认的 GIN 索引模式支持带有 @>, ?, ?& 和 ?| 操作的查询,关于这些操作符的含义参考本文的附录。
假如有一个文档:
1 |
{ |
我们将表名定义为 api, jsonb 字段为 jdoc,创建如下索引
1 |
CREATE INDEX idx_gin_api_jdoc ON api USING gin (jdoc); |
那么如下的查询可以使用索引
1 |
-- Find documents in which the key "company" has value "Magnafone" |
备注:上面这个例子来自手册。
参考
- WAITING FOR 9.4 – INTRODUCE JSONB, A STRUCTURED FORMAT FOR STORING JSON
- PostgreSQL 9.4 new data type jsonb – do not need to reparser when used
- PostgreSQL 9.4 Beta 1发布,支持JSONB
- JSON Functions and Operators
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/238062.html