jsonb上的GIN索引支持@>、?、 ?&、?|操作符,例如以下查询将会使用索引:
- SELECT * FROM tbl_user_jsonb WHERE user_info @> '{"user_name": "1_frans"}'
但是以下基于jsonb键值的查询不会走索引idx_gin,如下所示:
- SELECT * FROM tbl_user_jsonb WHERE user_info->>'user_name'= '1_francs';
如果要想提升基于jsonb类型的键值检索效率,可以在jsonb数据类型对应的键值上创建索引,如下所示:
- CREATE INDEX idx_gin_user_infob_user_name ON tbl_user_jsonb USING btree ((user_info ->> 'user_name'));
创建以上索引后,上述根据user_info->>'user_name'键值查询的SQL将会走索引。
二、JSON与JSONB读写性能测试
前面介绍了jsonb数据类型索引创建相关内容,本部分将对json、jsonb读写性能进行简单对比。json与jsonb读写性能存在差异,主要表现为json写入时比jsonb快,但检索时比jsonb慢,主要原因为:
json存储格式为文本,而jsonb存储格式为二进制,存储格式的不同使得两种json数据类型的处理效率不一样,json类型存储的内容和输入数据一样,当检索json数据时必须重新解析,而jsonb以二进制形式存储已解析好的数据,当检索jsonb数据时不需要重新解析。
1、构建JSON、JSONB测试表
下面通过一个简单的例子测试下json、jsonb的读写性能差异,计划创建以下三张表:
-
quser_ini:基础数据表,并插入200万测试数据;
-
qtbl_user_json: json 数据类型表,200万数据;
-
qtbl_user_jsonb:jsonb 数据类型表,200万数据。
首先创建user_ini表并插入200万测试数据,如下:
- mydb=> CREATE TABLE user_ini(id int4 ,user_id int8, user_name character varying(64),create_time timestamp(6) with time zone default clock_timestamp);
-
- CREATE TABLE
-
- mydb=> INSERT INTO user_ini(id,user_id,user_name)
-
- SELECT r,round(random*2000000), r || '_francs' FROM generate_series(1,2000000) as r;
-
- INSERT 0 2000000
计划使用user_ini表数据生成json、jsonb数据,创建user_ini_json、user_ini_jsonb表,如下所示:
- mydb=> CREATE TABLE tbl_user_json(id serial, user_info json);
- CREATE TABLE
- mydb=> CREATE TABLE tbl_user_jsonb(id serial, user_info jsonb);
- CREATE TABLE
2、JSON与JSONB表写性能测试
根据user_ini数据通过row_to_json函数向表user_ini_json插入200万json数据,如下:
- mydb=> iming
- Timing is on.
- mydb=> INSERT INTO tbl_user_json(user_info) SELECT row_to_json(user_ini)
- FROM user_ini;
- INSERT 0 2000000
- Time: 13825.974 ms (00:13.826)
从以上结果看出tbl_user_json插入200万数据花了13秒左右;接着根据user_ini表数据生成200万jsonb数据并插入表tbl_user_jsonb,如下:
- mydb=> INSERT INTO tbl_user_jsonb(user_info)
- SELECT row_to_json(user_ini)::jsonb FROM user_ini;
- INSERT 0 2000000
- Time: 20756.993 ms (00:20.757)
从以上看出tbl_user_jsonb表插入200万jsonb数据花了20秒左右,正好验证了json数据写入比jsonb快,比较两表占用空间大小,如下所示:
- mydb=> dt+ tbl_user_json
- List of relations
- Schema | Name | Type | Owner | Size | Description
- --------+---------------+-------+--------+--------+-------------
- pguser | tbl_user_json | table | pguser | 281 MB |
- (1 row)
- mydb=> dt+ tbl_user_jsonb
- --------+----------------+-------+--------+--------+-------------
- pguser | tbl_user_jsonb | table | pguser | 333 MB |
- (1 row)
从占用空间来看,同样的数据量jsonb数据类型占用空间比json稍大。 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|