根据以上看出,查询表tbl_user_json的user_info字段id键值在1到10000范围内的记录走了索引,并且执行时间为27.092毫秒,接着测试tbl_user_jsonb表同样SQL的检索性能,如下所示:
- mydb=> EXPLAIN ANALYZE SELECT id,user_info->'id',user_info->'user_name'
- FROM tbl_user_jsonb
- 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)
- Heap Blocks: exact=393
- -> 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)
- Planning time: 0.104 ms
- Execution time: 8.656 ms
- (7 rows)
根据以上看出,查询表tbl_user_jsonb的user_info字段id键值在1到10000范围内的记录走了索引并且执行时间为8.656毫秒,从这个测试看出jsonb检索比json效率高。
从以上两个测试看出,正好验证了“json写入比jsonb快,但检索时比jsonb慢”的观点,值得一提的是如果需要通过key/value进行检索,例如以下:
- SELECT * FROM tbl_user_jsonb WHERE user_info @> '{"user_name": "2_francs"}';
这时执行计划为全表扫描,如下所示:
- mydb=> EXPLAIN ANALYZE SELECT * FROM tbl_user_jsonb WHERE user_info @> '{"user_name": "2_francs"}';
- QUERY PLAN
- ------------------------------------------------------------------------------------
- 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)
- Filter: (user_info @> '{"user_name": "2_francs"}'::jsonb)
- Rows Removed by Filter: 1999999
- Planning time: 0.065 ms
- Execution time: 582.232 ms
- (5 rows)
从以上看出执行时间为582毫秒左右,在tbl_user_jsonb字段user_info上创建gin索引,如下所示:
- mydb=> CREATE INDEX idx_tbl_user_jsonb_user_Info ON tbl_user_jsonb USING gin(user_Info);
- CREATE INDEX
索引创建后,再次执行以下,如下所示:
- 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)
- Recheck Cond: (user_info @> '{"user_name": "2_francs"}'::jsonb)
- Heap Blocks: exact=1
- -> 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)
- Index Cond: (user_info @> '{"user_name": "2_francs"}'::jsonb)
- Planning time: 0.094 ms
- Execution time: 0.114 ms
- (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 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|