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稍大。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|