2016-01-31 20 views
8

Kürzlich merke ich einen riesigen Leistungsunterschied zwischen mehreren Upserts (über bulk operations) vs Einfügung (mehrere Dokumente). Ich würde gerne wissen, ob ich das richtig bin:MongoDB: Update/Upsert vs Einfügen

  • Upsert/Updates werden wie sein ein find() und update() so dass es 2 Dinge lesen und schreiben
  • Insert wird nur schreiben, so seine viel schneller

Also der Leistungsunterschied?

Wenn dies der Fall ist, frage ich mich, ob ich eine Menge Schreibvorgänge regelmäßig brauche, anstatt ein Dokument zu aktualisieren, schreibe ich ein neues Dokument mit einem createdOn Feld. Zur Abfrage werde ich dann nach Dokumenten suchen, sortiert nach createdOn DESC. Ich frage mich, ob das eine gute Methode ist? Oder gibt es einen besseren Weg?

  • Ich frage mich, ob ich Index über die Sammlung habe, könnte es das Update beschleunigen? Aber wird dieser Index den Schreibbereich dann verlangsamen?
  • Mit dem 2. Weg, wo ich nur Einsätze mache, wird es verlangsamen 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.
  • +0

    Im Allgemeinen dienen Indizes nur zum Beschleunigen von Lesevorgängen. Nicht schreibt. –

    +0

    => Jedes Mal ein anderes Dokument erstellen: Je nachdem, wie oft Sie das Dokument hinzufügen, wird es eine gute Lösung sein. Wenn die Dokumentenanzahl in sehr kurzer Zeit sehr groß ist, wird Ihre Suchanfrage langsamer ausgeführt. Ich werde diese Bcos nicht verwenden Ich habe Bestelldokumente in jeder Frage ... Auch ich muss ein einziges Dokument bekommen. –

    Antwort

    2

    Ich habe keine offizielle Erklärung gefunden, wie ein Upsert in MongoDB funktioniert, aber ja, es ist sicher anzunehmen, dass die Operation darauf abzielt, vorhandene Dokumente zu aktualisieren und nur ein Dokument hinzuzufügen mit den angegebenen Kriterien kann 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 immer noch: nur ein Dokument hinzufügen wird schneller bleiben.

    Wenn Sie in Ihrem Szenario wissen, dass Sie Dokumente nicht aktualisieren möchten, sind die Einfügungen in der Regel 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 Einsatz einfach fehlschlagen.

    Alles in allem hängt es von dem spezifischen Szenario ab, 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 Indizes kümmern, die in Ihren Leseszenarios verwendet werden. auf, herauszufinden, ob Ihre Indizes etwas zu den Abfragepläne Ihre (lesen) Indizes, eine ziemlich gute Erklärung auf die Gestaltung https://docs.mongodb.com/v3.4/core/write-performance/

    Weitere Informationen werden hinzufügen:

    einige zusätzliche Informationen können auf der Mongo-Website zu finden hier gefunden: https://docs.mongodb.com/v3.4/tutorial/analyze-query-plan/

    ich hoffe das hilft.

    10

    Wenn Ihr Dokument einfügt, muss Mongodb überprüfen, ob das Dokument mit der gleichen ObjectId vorhanden ist 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 langsamer 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.

    Eg .....

    So Insert wie diese // (Fast) sein kann

    1. (Check für Dokument -> nicht gefunden -> Einfügen eines neuen Dokument) Else
    2. (prüfen Sie, ob Dokument -> gefunden -> kann nicht eingelegt)

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

    1. (Check für Dokument -> nicht gefunden -> Einfügen eines neuen Dokument) Else
    2. (Check für Dokument -> Gefunden -> Aktualisieren Sie das Dokument)

    oder zu aktualisieren, mit Upsert (Ohne ObjectId) // Dies ist langsam

    1. (Finden ObjectId des (langsam) -> nicht gefunden -> neues Dokument einfügen) Else
    2. (Finden ObjectId des (langsam) -> gefunden -> die Dokumente aktualisieren)