加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PostgreSQL何以支持丰富的NoSQL特性?

发布时间:2018-10-13 17:18:26 所属栏目:编程 来源:DBAplus社群
导读:【新品产上线啦】51CTO播客,随时随地,碎片化进修 作者先容 谭峰,网名francs,中国开源软件推进同盟PostgreSQL分会特聘专家,《PostgreSQL拭魅战》作者之一,《PostgreSQL 9 Administration Cookbook》译者之一。现就职于浙江移动认真应用上云架构管控以及

jsonb上的GIN索引支持@>、?、 ?&、?|操纵符,譬喻以下查询将会行使索引:

  1. SELECT * FROM tbl_user_jsonb WHERE user_info @> '{"user_name": "1_frans"}' 

可是以下基于jsonb键值的查询不会走索引idx_gin,如下所示:

  1. SELECT * FROM tbl_user_jsonb WHERE user_info->>'user_name'= '1_francs'; 

假如要想晋升基于jsonb范例的键值检索服从,可以在jsonb数据范例对应的键值上建设索引,如下所示:

  1. 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万测试数据,如下:

  1. 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); 
  2.  
  3. CREATE TABLE 
  4.  
  5. mydb=> INSERT INTO user_ini(id,user_id,user_name) 
  6.  
  7. SELECT r,round(random*2000000), r || '_francs' FROM generate_series(1,2000000) as r; 
  8.  
  9. INSERT 0 2000000 

打算行使user_ini表数据天生json、jsonb数据,建设user_ini_json、user_ini_jsonb表,如下所示:

  1. mydb=> CREATE TABLE tbl_user_json(id serial, user_info json);  
  2. CREATE TABLE  
  3. mydb=> CREATE TABLE tbl_user_jsonb(id serial, user_info jsonb);  
  4. CREATE TABLE 

2、JSON与JSONB表写机能测试

按照user_ini数据通过row_to_json函数向表user_ini_json插入200万json数据,如下:

  1. mydb=> iming  
  2. Timing is on.  
  3. mydb=> INSERT INTO tbl_user_json(user_info) SELECT row_to_json(user_ini)  
  4. FROM user_ini;  
  5. INSERT 0 2000000  
  6. Time: 13825.974 ms (00:13.826) 

从以上功效看出tbl_user_json插入200万数据花了13秒阁下;接着按照user_ini表数据天生200万jsonb数据并插入表tbl_user_jsonb,如下:

  1. mydb=> INSERT INTO tbl_user_jsonb(user_info)  
  2. SELECT row_to_json(user_ini)::jsonb FROM user_ini;  
  3. INSERT 0 2000000  
  4. Time: 20756.993 ms (00:20.757) 

从以上看出tbl_user_jsonb表插入200万jsonb数据花了20秒阁下,正好验证了json数据写入比jsonb快,较量两表占用空间巨细,如下所示:

  1. mydb=> dt+ tbl_user_json  
  2. List of relations  
  3. Schema | Name | Type | Owner | Size | Description  
  4. --------+---------------+-------+--------+--------+-------------  
  5. pguser | tbl_user_json | table | pguser | 281 MB |  
  6. (1 row)  
  7. mydb=> dt+ tbl_user_jsonb  
  8. --------+----------------+-------+--------+--------+-------------  
  9. pguser | tbl_user_jsonb | table | pguser | 333 MB |  
  10. (1 row) 

从占用空间来看,同样的数据量jsonb数据范例占用空间比json稍大。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读