大規模なJSONデータセットでのPostgreSQLとMongoDBのどちらが速いですか?


10

9mのJSONオブジェクトがそれぞれ約300バイトの大きなデータセットがあります。それらはリンクアグリゲーターからの投稿です。基本的にはリンク(URL、タイトル、著者ID)とコメント(テキストと著者ID)+メタデータです。

子レコードを指すIDを持つ配列フィールドが1つあるという事実を除いて、それらはテーブルのリレーショナルレコードである可能性が非常に高いです。

どの実装がより堅固に見えますか?

  1. PostgreSQLデータベース上のJSONオブジェクト(1つの列を持つ1つの大きなテーブル、つまりJSONオブジェクト)
  2. MongoDB上のJSONオブジェクト
  3. JSONオブジェクトを列に分解し、PostgreSQLで配列を使用する

結合のパフォーマンスを最大化したいので、データをマッサージして、興味深い分析が見つかるまで調査できます。その時点で、データを各分析に固有の形式に変換する方が良いと思います。


スノーフレークをチェックアウトしたいかもしれません。構造化データと半構造化データの両方を一緒に処理できます。www.snowflake.net

「ジョインでのパフォーマンスを最大にする」があなたにとって何を意味するかを拡張する必要があると思います。何に参加する?
Spacedman、2015

回答:


10

データのロードに関しては、PostgreはMongoDBよりも優れています。クエリ数を返す場合、MongoDBはほとんど常に高速です。PostgreSQLは、ほとんどの場合、インデックスを使用するクエリに対して高速です。

詳細については、このウェブサイトこれもチェックしてください。彼らは非常に詳細な説明をしています。


非常に良いリンク、特に最初のリンクはより詳細で完全に見えます。年(文字列)を検索し、レコードID(int)を返す場合、potgresqlは約4倍高速ですが、作成者を返す場合、大きさの順序は同じです。MongoDBは、著者を返すときに約20%遅くなります。これを説明できるintを返すことと文字列を返すことの間に根本的な違いはありますか?つまり、recidが文字列の場合、postgresqlの利点はなくなり、どちらも作者の場合とほぼ同じになるのでしょうか。
MASL 2015

1

Mongodbのスキーマレス設計から、より多くのメリットを得ることができます。つまり、その場でデータ構造を変更するのは非常に簡単です。

Mongodbには参加などというものはありません。したがって、データについての考え方とデータの使用方法を変更して、ドキュメントベースのスキーマレスデータベース環境に対応する必要があります。

視点と優先順位が変化するにつれて、速度はそれほど重要ではなくなります。

お役に立てば幸いです。

-トッド


最近のベンチマークでは、PostgreSQLは完全にMongoDBを所有しています...
QUITがあり

@ Anony-Mousse:興味深い。出典を知っていますか?
Isaac

例:tiborsimko.org/postgresql-mongodb-json-select-speed.htmlおよびenterprisedb.com/postgres-plus-edb-blog/marc-linster/…他の回答から。主な理由は次のとおりです。Postgresには優れたインデックスがありますが、MongoDBのインデックスは価値がありません。さらに、PostgresはBSONのサポートと、JSONを処理するためのその他の追加機能を備えているため、パフォーマンスが大幅に向上しました。そのため、最初のバージョンよりもはるかに高速になりました。
QUITあり-Anony-Mousse 2016年

0

あなたが言及する数値については、すべての代替案が機能するはずです(読んでください:妥当な時間内に分析を完了することができます)。大幅に高速な結果が得られるデザインをお勧めします。

以前に回答したように、一般にpostgresqlはmongoよりも高速で、場合によっては4倍以上高速です。例を参照してください:http : //www.enterprisedb.com/postgres-plus-edb-blog/marc-linster/postgres-outperforms-mongodb-and-ushers-new-developer-reality

結合のパフォーマンスを向上させることに関心があるとおっしゃいました。エンティティ(投稿、著者など)間の類似度を計算することに関心があると思いますので、主にテーブルにそれ自体(たとえば、投稿者または著者)を結合し、集計します。

さらに、最初のロード後、データベースは読み取り専用になるため、問題はインデックスの使用に非常に適しています。インデックスの更新はありません。インデックスの追加のストレージがあるためです。

私はpostgresを使用して、データを2つのテーブルに格納します。

テーブルpost(post_id integer、url varchar(255)、author_id integer)を作成します。

-データをロードしてから、インデックスを作成します。-これにより、読み込みが高速になり、インデックスが改善され、テーブルポストが制約posts_pk主キー(post_id)を追加します。posts(author_id);にインデックスpost_authorを作成します。

テーブルのコメントを作成します(comment_id integer、post_id integer、author_id integer、comment varchar(255)); 変更テーブルのコメントは制約comments_pk主キー(comment_id)を追加します。コメント(author_id)にインデックスcomment_authorを作成します。インデックスcomment_postをコメント(post_id);に作成します。

次に、select mなどのクエリのコメントに基づいて著者の類似性を計算できます。author_idをm_author_idとして、a。author_id as a_author_id、count(distinct m.post_id)as posts from comments as m as joins as a(post_id)group by m.author_id、a。author_id

nlpのコメントの単語をトークン化することに関心がある場合は、そのための別のテーブルを追加しますが、データの量が大幅に増えることに注意してください。通常、データベース内のトークン化全体を表さない方がよいでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.