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

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

发布时间:2018-10-02 15:38:22 所属栏目:MySql教程 来源:DBAplus社群
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 作者介绍 谭峰,网名francs,中国开源软件推进联盟PostgreSQL分会特聘专家,《PostgreSQL实战》作者之一,《PostgreSQL 9 Administration Cookbook》译者之一。现就职于浙江移动负责应用上云架构管控以及

根据以上看出,查询表tbl_user_json的user_info字段id键值在1到10000范围内的记录走了索引,并且执行时间为27.092毫秒,接着测试tbl_user_jsonb表同样SQL的检索性能,如下所示:

  1. mydb=> EXPLAIN ANALYZE SELECT id,user_info->'id',user_info->'user_name'  
  2. FROM tbl_user_jsonb  
  3. Bitmap Heap Scan on tbl_user_jsonb (cost=158.93..14316.93 rows=10000 width=68) (actual time=1.140..8.116 rows=9998 loops=1)  
  4. Heap Blocks: exact=393  
  5. -> Bitmap Index Scan on idx_gin_user_infob_id (cost=0.00..156.43 rows=10000 width=0) (actual time=1.058..1.058 rows=18992 loops =1)  
  6. Planning time: 0.104 ms  
  7. Execution time: 8.656 ms  
  8. (7 rows) 

根据以上看出,查询表tbl_user_jsonb的user_info字段id键值在1到10000范围内的记录走了索引并且执行时间为8.656毫秒,从这个测试看出jsonb检索比json效率高。

从以上两个测试看出,正好验证了“json写入比jsonb快,但检索时比jsonb慢”的观点,值得一提的是如果需要通过key/value进行检索,例如以下:

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

这时执行计划为全表扫描,如下所示:

  1. mydb=> EXPLAIN ANALYZE SELECT * FROM tbl_user_jsonb WHERE user_info @> '{"user_name": "2_francs"}';  
  2. QUERY PLAN  
  3. ------------------------------------------------------------------------------------  
  4. Seq Scan on tbl_user_jsonb (cost=0.00..67733.00 rows=2000 width=143) (actual time=0.018..582.207 rows=1 loops=1)  
  5. Filter: (user_info @> '{"user_name": "2_francs"}'::jsonb)  
  6. Rows Removed by Filter: 1999999  
  7. Planning time: 0.065 ms  
  8. Execution time: 582.232 ms  
  9. (5 rows) 

从以上看出执行时间为582毫秒左右,在tbl_user_jsonb字段user_info上创建gin索引,如下所示:

  1. mydb=> CREATE INDEX idx_tbl_user_jsonb_user_Info ON tbl_user_jsonb USING gin(user_Info); 
  2. CREATE INDEX

索引创建后,再次执行以下,如下所示:

  1. Bitmap Heap Scan on tbl_user_jsonb (cost=37.50..3554.34 rows=2000 width=143) (actual time=0.079..0.080 rows=1 loops=1)  
  2. Recheck Cond: (user_info @> '{"user_name": "2_francs"}'::jsonb)  
  3. Heap Blocks: exact=1  
  4. -> Bitmap Index Scan on idx_tbl_user_jsonb_user_info (cost=0.00..37.00 rows=2000 width=0) (actual time=0.069..0.069 rows=1 loops=1)  
  5. Index Cond: (user_info @> '{"user_name": "2_francs"}'::jsonb)  
  6. Planning time: 0.094 ms  
  7. Execution time: 0.114 ms  
  8. (7 rows) 

从以上看出走了索引,并且执行时间下降到了0.114毫秒。

这部分内容测试了json、jsonb数据类型读写性能差异,验证了json写入时比jsonb快,但检索时比jsonb慢的观点。

三、全文检索支持JSON和JSONB

接下来我们来介绍PostgreSQL 10的一个新特性:全文检索支持json、jsonb数据类型。这部分我们会分两部分来说明,第一部分简单介绍PostgreSQL全文检索,第二部分演示全文检索对json、jsonb数据类型的支持。

1、PostgreSQL全文检索简介

对于大多数应用全文检索很少放到数据库中实现,一般使用单独的全文检索引擎,例如基于SQL全文检索引擎Sphinx。PostgreSQL支持全文检索,对于规模不大的应用如果不想搭建专门的搜索引擎,PostgreSQL的全文检索也可以满足需求。

如果没有使用专门的搜索引擎,大部检索需要通过数据库like操作匹配,这种检索方式主要缺点在于:

  • 不能很好的支持索引,通常需全表扫描检索数据,数据量大时检索性能很低;

  • 不提供检索结果排序,当输出结果数据量非常大时表现更加明显。

PostgreSQL全文检索能有效地解决这个问题,PostgreSQL全文检索通过以下两种数据类型来实现。

Tsvector

(编辑:晋中站长网)

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

热点阅读