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