PostgreSQL 9.4 正在加载一项新功能叫jsonb,是一种新型资料,可以储存支援GIN索引的JSON 资料。换言之,此功能,在即将来临的更新中最重要的是,如果连这都不重要的话,那就把Postgres 置于文件为本数据库系统的推荐位置吧。
自从9.2开始,一个整合JSON 资料类型已经存在,带有一整套功能(例如资料产生和资料解构功能),还有9.3新增的操作者。当使用JSON 资料类型,资料的被存储成一完全一样的副本,功能还在此之上运作,还另外需要后台运作的重新分析。
这心得JSONB 资料类型以已降解的2元格式存储,所以,插入此资料会比JSON高效,因为后台不再需要重新分析,因此让它更快速运行,而且还兼顾GIN 索引。就是因为最后这个原因,我们实际上建议读者使用jsonb来代替json制作程式(当然你还可以因应需要而使用json)。请记住jsonb使用相同的操作者和功能,读者们可以看我之前的帖子去令你得到些什么启发(或者干脆看Postgres的文件)。
现在让我们看一下JSONB是如何工作的,同时和JSON比较一下。采用的测试数据是860万的geobase类型数据,大概1.1G大小,包括了城市名,国家代码(可以在这参见完整列表)等很多字段。首先通过底层复制(raw copy)来把这些数据存储到数据库的一个新表里面,之后把这张表通过一组填充因子是100的表转换成JSON/JSONB,之后来看它们各占多少空间。
=# COPY geodata FROM '$HOME/Downloads/allCountries.txt'; COPY 8647839 =# CREATE TABLE geodata_jsonb (data jsonb) with (fillfactor=100); CREATE TABLE =# CREATE TABLE geodata_json (data json) with (fillfactor=100); CREATE TABLE =# \timing Timing is on. =# INSERT INTO geodata_json SELECT row_to_json(geodata) FROM geodata; INSERT 0 8647839 Time: 287158.457 ms =# INSERT INTO geodata_jsonb SELECT row_to_json(geodata)::jsonb FROM geodata; INSERT 0 8647839 Time: 425825.967 ms
生成JSONB数据花费稍微长一点时间,大小有没有区别呢?
=# SELECT pg_size_pretty(pg_relation_size('geodata_json'::regclass)) AS json, pg_size_pretty(pg_relation_size('geodata_jsonb'::regclass)) AS jsonb; json | jsonb ---------+--------- 3274 MB | 3816 MB (1 row)
在JSON数据上面做索引从9.3版本开始,比如用操作符(注意 因为它返回文本,所以'-'被采用;并且根据查询不同,索引采用不同的关键字)
=# CREATE INDEX geodata_index ON geodata_json ((data-'country_code'), (data-'asciiname')); CREATE INDEX =# SELECT pg_size_pretty(pg_relation_size('geodata_index'::regclass)) AS json_index; json_index ------------ 310 MB (1 row) =# SELECT (data-'population')::int as population, data->'latitude' as latitude, data->'longitude' as longitude FROM geodata_json WHERE data-'country_code' = 'JP' AND data-'asciiname' = 'Tokyo' AND (data-'population')::int != 0; population | latitude | longitude ------------+----------+----------- 8336599 | 35.6895 | 139.69171 (1 row) =# -- Explain of previous query QUERY PLAN ------------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on geodata_json (cost=6.78..865.24 rows=215 width=32) Recheck Cond: (((data - 'country_code'::text) = 'JP'::text) AND ((data - 'asciiname'::text) = 'Tokyo'::text)) Filter: (((data - 'population'::text))::integer <> 0) -> Bitmap Index Scan on geodata_index (cost=0.00..6.72 rows=216 width=0) Index Cond: (((data - 'country_code'::text) = 'JP'::text) AND ((data - 'asciiname'::text) = 'Tokyo'::text)) Planning time: 0.172 ms (6 rows)
在这个例子里,计划(planner)可以使用bitmap索引扫描,同时使用了之前产生的索引。
现在,JSONB的一个新特点就是检查包含带有操作符@>的数据容量,这种数据是可以用GIN来索引的,这种操作符数据也包括了"htmlcode">
=# CREATE INDEX geodata_gin ON geodata_jsonb USING GIN (data jsonb_hash_ops); CREATE INDEX =# SELECT (data-'population')::int as population, data->'latitude' as latitude, data->'longitude' as longitude FROM geodata_jsonb WHERE data @> '{"country_code": "JP", "asciiname": "Tokyo"}' AND (data-'population')::int != 0; population | latitude | longitude ------------+----------+----------- 8336599 | 35.6895 | 139.69171 (1 row) =# SELECT pg_size_pretty(pg_relation_size('geodata_gin'::regclass)) AS jsonb_gin; jsonb_gin ----------- 1519 MB (1 row) =# -- EXPLAIN of previous query QUERY PLAN ------------------------------------------------------------------------------------- Bitmap Heap Scan on geodata_jsonb (cost=131.01..31317.76 rows=8605 width=418) Recheck Cond: (data @> '{"asciiname": "Tokyo", "country_code": "JP"}'::jsonb) Filter: (((data - 'population'::text))::integer <> 0) -> Bitmap Index Scan on geodata_gin (cost=0.00..128.86 rows=8648 width=0) Index Cond: (data @> '{"asciiname": "Tokyo", "country_code": "JP"}'::jsonb) Planning time: 0.134 ms
根据应用的需求,你或许想采用空间消耗低的索引,比如BTree建立在JSON数据上的索引类型;GIN索引有着更多的优点,因为它覆盖了所有的JSON字段,并且检查容量;
PostgreSQL
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。