哪个更快:大型JSON数据集上的PostgreSQL vs MongoDB?


10

我有一个大型数据集,其中有9m个JSON对象,每个对象约300个字节。它们是来自链接聚合器的帖子:基本上是链接(URL,标题和作者ID)和评论(文本和作者ID)+元数据。

它们很可能是表中的关系记录,但事实是它们具有一个数组字段,其ID指向子记录。

什么样的实现看起来更可靠?

  1. PostgreSQL数据库上的JSON对象(只有一个大表且只有一列,即JSON对象)
  2. MongoDB上的JSON对象
  3. 将JSON对象分解为列,并在PostgreSQL上使用数组

我想最大程度地提高联接的性能,因此我可以对数据进行按摩和探索,直到找到有趣的分析为止,这时我认为将数据转换为特定于每种分析的形式会更好。


可能想结帐雪花。它可以同时处理结构化和半结构化数据。www.snowflake.net

我认为您需要扩展“最大化连接性能”对您的意义。加盟什么?
Spacedman

Answers:


10

对于数据加载,Postgre优于MongoDB。返回查询计数时,MongoDB几乎总是更快。对于使用索引的查询,PostgreSQL几乎总是更快。

看看这个网站一个太以获得更多信息。他们有非常详细的解释。


很好的链接,特别是第一个看起来更详尽和透彻的链接。当搜索年份(一个字符串)并返回记录ID(一个int)时,potgresql大约快4倍,但是当返回作者时,数量级是相同的。返回作者时,MongoDB仅慢20%。返回int和返回可以解释这一点的字符串之间有根本区别吗?就是说,如果recid是一个字符串,那么postgresql的优势会消失吗,并且两者都与author情况相同?
MASL 2015年

1

您可能会从Mongodb的无模式设计中受益更多。这意味着它非常容易即时修改数据结构。

Mongodb中没有联接。因此,需要修改数据的思考方式和使用方式,以解决基于文档和无模式的数据库环境的问题。

随着观点和重点的改变,速度可能变得不那么重要。

希望对您有所帮助。

-托德


在最新的基准测试中,PostgreSQL完全拥有MongoDB ...
退出了–Anony-Mousse 2015年

@ Anony-Mousse:有趣。你知道任何来源吗?
以撒

例如,tiborsimko.org / postgresql-mongodb-json-select-speed.htmlenterprisedb.com/postgres-plus-edb-blog/marc-linster/…来自其他答案。一个关键原因是:Postgres具有良好的索引,而MongoDB中的索引不值得。此外,Postgres获得了BSON支持和其他用于处理JSON的附加功能,确实提高了性能。这就是为什么它比第一个版本快很多的原因。
已退出-Anony-Mousse

0

对于您提到的数字,我认为所有替代方法都可以使用(请阅读:您将能够在合理的时间内完成分析)。我建议您使用可以显着加快结果的设计。

如前所述,一般而言,postgresql比mongo快,有时要快4倍以上。例如,请参见:http : //www.enterprisedb.com/postgres-plus-edb-blog/marc-linster/postgres-outperforms-mongodb-and-ushers-new-developer-reality

您说您对提高联接的性能感兴趣。我假设您对计算实体(例如,帖子,作者)之间的相似性感兴趣,因此您将主要将表与自身(例如,通过帖子或作者)一起加入并进行汇总。

此外,在初始加载数据库之后,数据库将是只读的,这使问题非常适合索引使用。您将不需要为索引更新付费,因为您没有索引更新,我想您会为索引留有更多的存储空间。

我将使用postgres并将数据存储在两个表中:

创建表帖子(post_id整数,url varchar(255),author_id整数);

-加载数据,然后创建索引。-这将导致更快的加载和更好的索引,在更改表后添加约束posts_pk主键(post_id); 在帖子上创建索引post_author(author_id);

创建表注释(comment_id整数,post_id整数,author_id整数,comment varchar(255));修改表注释添加约束comment_pk主键(comment_id); 在评论上创建索引comment_author(author_id); 在评论上创建索引comment_post(post_id);

然后,您可以基于查询(例如select m)中的注释来计算作者相似度。author_id为m_author_id,author_id为a_author_id,count(distinct m.post_id)作为来自m的注释的帖子,由m.author_id作为使用(post_id)组的注释加入。author_id

如果您有兴趣对nlp注释中的单词进行标记,请为此添加另一个表,但请记住,这将大大增加数据量。通常,最好不要在数据库中表示整个标记化。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.