加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2018-11-08 07:44:24 所属栏目:MySql教程 来源:DBAplus社群
导读:副标题#e# 【新品产上线啦】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稍大。

(编辑:常州站长网)

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

热点阅读