Was ist schneller: PostgreSQL vs MongoDB auf großen JSON-Datasets?

10

Ich habe einen großen Datensatz mit 9 Millionen JSON-Objekten mit jeweils ~ 300 Bytes. Dies sind Beiträge eines Link-Aggregators: Links (URL, Titel und Autoren-ID) und Kommentare (Text und Autoren-ID) + Metadaten.

Es kann sich durchaus um relationale Datensätze in einer Tabelle handeln, mit Ausnahme der Tatsache, dass sie ein Arrayfeld mit IDs haben, die auf untergeordnete Datensätze verweisen.

Welche Implementierung sieht solider aus?

  1. JSON-Objekte in einer PostgreSQL-Datenbank (nur eine große Tabelle mit einer Spalte, nämlich das JSON-Objekt)
  2. JSON-Objekte in einer MongoDB
  3. Explodieren Sie die JSON-Objekte in Spalten und verwenden Sie Arrays unter PostgreSQL

Ich möchte die Leistung in Joins maximieren, damit ich die Daten massieren und untersuchen kann, bis ich interessante Analysen finde. An diesem Punkt denke ich, dass es besser ist, die Daten in eine für jede Analyse spezifische Form umzuwandeln.

Blue-Dino
quelle
Vielleicht möchten Sie Schneeflocke auschecken. Es kann sowohl strukturierte als auch halbstrukturierte Daten zusammen verarbeiten. www.snowflake.net
Ich denke, Sie müssen näher darauf eingehen, was "Maximieren der Leistung bei Verknüpfungen" für Sie bedeutet. Was beitreten?
Spacedman

Antworten:

10

Beim Laden von Daten übertrifft Postgre MongoDB. MongoDB ist fast immer schneller, wenn die Anzahl der Abfragen zurückgegeben wird. PostgreSQL ist bei Abfragen mit Indizes fast immer schneller.

Check this out Webseite und diese eine zu für weitere Informationen. Sie haben sehr detaillierte Erklärungen.

Programmierer ohne Titel
quelle
Sehr gute Links, besonders der erste, der detaillierter und gründlicher aussieht. Bei der Suche nach einem Jahr (einer Zeichenfolge) und der Rückgabe der Datensatz-ID (einer int) ist potgresql etwa viermal schneller, bei der Rückgabe des Autors ist die Größenordnung jedoch dieselbe. MongoDB ist nur etwa 20% langsamer, wenn der Autor zurückkehrt. Gibt es einen grundlegenden Unterschied zwischen der Rückgabe eines int und der Rückgabe eines Strings, der dies erklären könnte? Das heißt, wenn recid eine Zeichenfolge wäre, würde der Vorteil von postgresql verschwinden und beide wären ungefähr gleich wie im Fall des Autors?
MASL
1

Sie können mehr vom schemenlosen Design von Mongodb profitieren. Dies bedeutet, dass es sehr einfach ist, Datenstrukturen im laufenden Betrieb zu ändern.

In Mongodb gibt es keinen Join. Wie man über Daten denkt und wie man sie verwendet, muss geändert werden, um dokumentbasierte und schemenlose Datenbankumgebungen zu berücksichtigen.

Vielleicht wird Geschwindigkeit weniger wichtig, wenn sich Perspektive und Prioritäten ändern.

Ich hoffe das hilft.

-Todd

Todd Canedy
quelle
In den letzten Benchmarks besaß PostgreSQL MongoDB vollständig ...
hat aufgehört - Anony-Mousse
@ Anony-Mousse: Interessant. Kennen Sie Quellen?
Isaac
zB tiborsimko.org/postgresql-mongodb-json-select-speed.html und enterprisedb.com/postgres-plus-edb-blog/marc-linster/… aus der anderen Antwort. Ein Hauptgrund ist: Postgres hat gute Indizes, während sich Indizes in MongoDB nicht lohnen. Darüber hinaus erhielt Postgres BSON-Unterstützung und andere Ergänzungen für die Handhabung von JSON, die die Leistung erheblich verbesserten. Deshalb wurde es viel schneller als in den ersten Versionen.
Hat aufgehört - Anony-Mousse
0

Für die Zahlen, die Sie erwähnen, sollten meiner Meinung nach alle Alternativen funktionieren (lesen Sie: Sie können Ihre Analyse in angemessener Zeit abschließen). Ich empfehle ein Design, das zu deutlich schnelleren Ergebnissen führen kann.

Wie bereits erwähnt, ist postgresql im Allgemeinen schneller als mongo, manchmal mehr als viermal schneller. Siehe zum Beispiel: http://www.enterprisedb.com/postgres-plus-edb-blog/marc-linster/postgres-outperforms-mongodb-and-ushers-new-developer-reality

Sie sagten, dass Sie daran interessiert sind, die Leistung bei Joins zu verbessern. Ich gehe davon aus, dass Sie daran interessiert sind, Ähnlichkeiten zwischen den Entitäten (z. B. Post, Autor) zu berechnen, sodass Sie die Tabelle hauptsächlich selbst (z. B. nach Post oder Autor) und aggregieren.

Hinzu kommt, dass Ihre Datenbank nach dem ersten Laden schreibgeschützt ist, was das Problem sehr gut für die Indexnutzung geeignet macht. Sie zahlen nicht für die Indexaktualisierung, da Sie keine haben und ich denke, Sie haben den zusätzlichen Speicher für den Index.

Ich hätte postgres verwendet und die Daten in zwei Tabellen gespeichert:

Tabellenbeiträge erstellen (post_id integer, url varchar (255), author_id integer);

- Laden Sie Daten und erstellen Sie dann die Indizes. - Dies führt zu einem schnelleren Laden und besseren Indizes, wenn Tabellenbeiträge geändert werden. Fügen Sie den Primärschlüssel posts_pk (post_id) hinzu. Index post_author für Beiträge erstellen (author_id);

Tabellenkommentare erstellen (comment_id-Ganzzahl, post_id-Ganzzahl, author_id-Ganzzahl, Kommentar varchar (255)); Tabellenkommentare ändern Constraint-Kommentar hinzufügen_pk Primärschlüssel (comment_id); Erstelle einen Index comment_author für Kommentare (author_id); Erstelle einen Index comment_post für Kommentare (post_id);

Dann können Sie die Autorenähnlichkeit basierend auf Kommentaren in Abfragen wie select m berechnen. author_id als m_author_id, a. author_id als a_author_id, zähle (eindeutige m.post_id) als Beiträge aus Kommentaren als m verbinde Kommentare als using (post_id) -Gruppe von m.author_id, a. author_id

Wenn Sie daran interessiert sind, die Wörter im Kommentar für nlp zu token, fügen Sie eine weitere Tabelle hinzu. Beachten Sie jedoch, dass dadurch das Datenvolumen erheblich erhöht wird. In der Regel ist es besser, nicht die gesamte Tokenisierung in der Datenbank darzustellen.

DaL
quelle