MongoDB: Update / Upsert vs Einfügen

9

Vor kurzem bemerkte ich einen enormen Leistungsunterschied zwischen mehreren Upserts (über Massenoperationen ) vs eine Beilage (mehrere Dokumente). Ich würde gerne wissen, ob ich das richtig mache:

  • Upsert / Updates ist wie ein find() und update() , so dass es 2 Dinge liest und schreibt
  • Einfügen wird nur so schreiben, es ist viel schneller

Also der Leistungsunterschied?

Wenn das der Fall ist, frage ich mich, ob ich regelmäßig viel schreiben muss, anstatt ein Dokument zu aktualisieren, schreibe ich ein neues Dokument mit einem createdOn -Feld. Zur Abfrage suche ich dann nach Dokumenten, sortiert nach createdOn DESC . Ich frage mich, ob das eine gute Methode ist? Oder gibt es einen besseren Weg?

  • Ich frage mich, ob ich einen Index für die Sammlung habe, könnte sie das Update beschleunigen? Aber wird dieser Index den Schreibbereich dann verlangsamen?
  • Mit dem 2. Weg, wo ich nur Einfügungen mache, wird es langsamer, dann habe ich zu viele Dokumente? Ist es praktisch (um die Schreibvorgänge zu beschleunigen)?
  • Ich habe auch versucht, die Größe des Verbindungspools zu erhöhen. Nicht sicher, was das Optimum ist, aber ich habe 20 probiert und ich sehe, dass ich ca. 20 Anfragen pro Sekunde durch Mongostat bewältigen kann. Ich habe erwartet, dass es viel höher ist.
Jiew Meng 31.01.2016, 10:34
quelle

2 Antworten

11

Wenn Ihr Dokument einfügt, muss Mongodb prüfen, ob das Dokument mit der gleichen objectId existiert oder nicht. Wenn es existiert, kann das Dokument nicht eingefügt werden.

Gleicher Fall gilt für Update. Es muss überprüft werden, ob das Dokument existiert oder nicht. Ein anderes Update kann nicht durchgeführt werden. Der Fall, in dem Ihre Aktualisierungsabfrage verlangsamt wird, wenn Sie das Dokument nicht auf der Grundlage Ihres ObjectId / Indexed-Feldes finden.

Else-Leistung zum Einfügen / Aktualisieren des Dokuments sollte gleich sein.

ZB .....

So einfügen kann wie folgt sein // (Fast)

  1. (Nach Dokument suchen - & gt; Nicht gefunden - & gt; Neues Dokument einfügen) Else
  2. (Nach Dokument suchen - & gt; Gefunden - & gt; Kann nicht eingefügt werden)

Und Update mit Upsert (ObjectId verfügbar) // (Fast)

  1. (Nach Dokument suchen - & gt; Nicht gefunden - & gt; Neues Dokument einfügen) Else
  2. (Nach Dokument suchen - & gt; Gefunden - & gt; Dokument aktualisieren)

Oder Update mit Upsert (ohne ObjectId) // Dies ist langsam

  1. (Find ObjectId (Langsam) - & gt; Nicht gefunden - & gt; Neues Dokument einfügen) Else
  2. (Find ObjectId (langsam) - & gt; Gefunden - & gt; Aktualisieren Sie die Dokumente)
Code OverFlow 16.01.2017 04:11
quelle
2

Ich habe keine offizielle Erklärung gefunden, wie ein Upsert in MongoDB funktioniert, aber es ist sicher anzunehmen, dass die Operation darauf abzielt, existierende Dokumente zu aktualisieren und nur ein Dokument hinzuzufügen, wenn das Dokument mit dem angegebenen übereinstimmt Kriterien können nicht gefunden werden.

Wenn Sie einen Index hinzufügen, kann der Upsert schneller werden: Schließlich wird der Index verwendet, um das Dokument zu finden. Der Vorbehalt bezieht sich auf die Felder, auf die der Index angewendet wird, und auf die Felder, die Sie aktualisieren. Wenn der aktualisierte Teil Teil des Indexes ist, wirkt sich dies bei der Aktualisierung des Dokuments auf die Leistung aus. Wenn der aktualisierte Teil nicht Teil des Indexes ist, entsteht keine Strafe für das Schreiben in das vorhandene Dokument. Wenn das Dokument jedoch hinzugefügt wird, haben Sie eine geringe Auswirkung auf die Leistung, da die Indexsammlung aktualisiert wird. Aber trotzdem: Das Hinzufügen eines Dokuments wird schneller bleiben.

Wenn Sie also in Ihrem Szenario wissen, dass Sie Dokumente nicht aktualisieren möchten, sind Einfügungen im Allgemeinen schneller. Wenn Sie sicherstellen möchten, dass Sie das gleiche Dokument nicht zweimal hinzufügen, können Sie auch einen eindeutigen Index hinzufügen. Dann wird ein Einfügen einfach fehlschlagen.

Alles in allem kommt es auf das spezifische Szenario an, aber basierend auf den Informationen, die ich aus Ihrer Frage extrahieren kann, denke ich, ist die beste Option, einfach die Dokumente einzufügen. Da Sie sicherstellen, dass das Feld "createdon" die Dokumente in Ihrem Szenario eindeutig macht, müssen Sie sich nur um die Indizes kümmern, die in Ihren Leseszenarien verwendet werden.

Einige zusätzliche Informationen finden Sie auf der Mongo-Website: Ссылка

Für weitere Informationen zum Entwerfen Ihrer (gelesenen) Indizes finden Sie hier eine ziemlich gute Erklärung, um herauszufinden, ob Ihre Indizes den Abfrageplänen etwas hinzufügen: Ссылка

Ich hoffe, das hilft.

    
Michaël van der Haven 17.12.2016 16:17
quelle

Tags und Links