MongoDB: Update/Upsert vs Einfügen
Kurzem Bemerke ich einen großen performance-Unterschied zwischen multiple-upserts (über bulk-Operationen) vs einfügen (mehrere Dokumente). Ich würde gerne wissen, ob bin ich richtig auf dieser:
- Upsert/Updates werden wie ein
find()
undupdate()
so gibt es 2 Sachen, Lesen und schreiben - Einfügen schreib einfach so seine viel schneller
Somit den Unterschied in der Leistung?
Wenn dies der Fall ist, Frage ich mich, ob ich brauche viel schreibt regelmäßig, statt der Aktualisierung eines Dokuments, Schreibe ich ein neues Dokument mit einer createdOn
Feld. Dann Abfragen, ich werde nur die Abfrage für Dokumente, sortiert nach createdOn DESC
. Ich Frage mich, ob das eine gute Methode? Oder gibt es eine bessere Möglichkeit?
- Frage ich mich, ob ich index für die Sammlung, könnte es beschleunigen das update? Aber nicht in diesem index verlangsamt das schreiben Teil dann?
- Mit dem 2. Weg, wo ich nur tun einfügt, wird es langsam nach unten, dann habe ich zu viele Dokumente? Ist es möglich (um die Geschwindigkeit des schreibt)?
- Ich habe auch versucht Erhöhung der Verbindungs-pool-Größe. Nicht sicher, was das optimale, aber ich habe versucht die 20, und ich sehe, kann ich mit ca 20 Abfragen pro Sek thru mongostat. Ich erwartet, dass es viel höher.
- Im Allgemeinen Indizes werden nur für die Beschleunigung liest. Nicht schreibt.
- => Erstellung von verschiedenen Dokumenten jedes mal : Es wird gute Lösung, je nachdem, wie Häufig Sie das Dokument hinzufügen. Wenn die Anzahl der Dokumente wird riesig sein in sehr weniger Zeit, finden Sie Ihre Abfrage wird langsamer. Ich werde nicht verwenden Sie diese bcos ich haben, um Dokumente in jeder Abfrage ... Auch habe ich, um ein einzelnes Dokument.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr Dokument einfügen, Mongodb muss überprüfen, ob das Dokument mit der gleichen objectId ist oder nicht vorhanden ist. Wenn Ihr existiert Dokument nicht eingefügt werden.
Gleichen Fall gelten, zu Aktualisieren. Es muss prüfen, ob das Dokument vorhanden ist oder nicht. sonst kann das update nicht durchgeführt werden. Der Fall, wo die update-Abfrage wird langsam ausgeführt, wenn Ihr nicht die Suche nach Dokumenten, basierend auf Ihren ObjectId /Indizierten Feld.
Sonst die Leistung für das einfügen /aktualisieren Dokument sollte gleich sein.
ZB.....
So Einfügen kann wie diese //(Schnell)
Und Aktualisieren Sie es mit einem einfachen Beispiel: (ObjectId verfügbar) //(Schnell)
Oder Update mit einem einfachen Beispiel: (Ohne ObjectId) //Das ist langsam
Ich habe nicht gefunden eine 'offizielle' Erklärung, wie ein
upsert
arbeitet in MongoDB, aber ja, es ist sicher anzunehmen, dass, da die operation zielt auf die Aktualisierung der vorhandenen Unterlagen und nur hinzufügen, ein Dokument, wenn das Dokument mit den angegebenen Kriterien gefunden werden kann.Wenn Sie einen index hinzuzufügen, dann die
upsert
können schneller geworden: nach all den index zu 'finden' das Dokument. Die Einschränkung ist in dem Bereich(s) der index arbeitet und die Felder, die Sie aktualisieren. Wenn der aktualisierte Teil ist Teil des index sind, haben Sie eine Auswirkung auf die Leistung auf die Aktualisierung des Dokuments. Wenn der aktualisierte Teil ist nicht Teil des index sind, werden Sie nicht entstehen, eine Strafe für das schreiben in das bestehende Dokument. Wenn das Dokument Hinzugefügt wird, obwohl, Sie müssen eine geringfügige Auswirkung auf die Leistung, da die index-Auflistung aktualisieren. Aber dennoch: nur das hinzufügen ein Dokument wird noch schneller.Deshalb, wenn in Ihrem Szenario, das Sie wissen, dass Sie nicht wollen, zu aktualisieren, Dokumente, fügt dann sind in der Regel schneller. Wenn Sie möchten, stellen Sie sicher, dass Sie nicht hinzufügen, das gleiche Dokument zweimal, Sie können auch entscheiden sich für das hinzufügen von einem eindeutigen index. Dann ein insert wird einfach fehlschlagen.
Alles in allem hängt es vom jeweiligen Szenario, aber basierend auf den Informationen, die ich extrahieren aus deiner Frage, ich denke die beste Möglichkeit ist, legen Sie einfach die Dokumente. Da Sie scheinen, um sicherzustellen, dass die "createdon" - Feld macht die Dokumente, die einzigartig in Ihrem Szenario müssen Sie nur sorgen über die Indizes, die verwendet werden, in Ihr zu Lesen-Szenarien.
Einige zusätzliche Infos finden Sie auf der MongoDB Website:
Weitere Informationen auf die Gestaltung Ihrer (lese -) Indizes, eine ziemlich gute Erklärung finden Sie heraus, ob Ihre Indizes noch etwas hinzufügen, um die Abfrage-Pläne gefunden werden kann hier:
Ich hoffe, das hilft.