Wie verbessert man die Leistung von update () und save () in MongoDB?

8

Ich suche nach Tipps zur Verbesserung der Datenbankleistung in der folgenden Situation.

Als Beispielanwendung habe ich heute eine ziemlich einfache App geschrieben, die mithilfe der Twitter-Streaming-API nach bestimmten Schlüsselwörtern sucht. Anschließend speichere ich die Ergebnisse in MongoDB. Die App wird mit Node.js geschrieben.

Ich speichere 2 Sammlungen. Einer speichert das Schlüsselwort und eine Reihe von Tweet-IDs, die auf jeden gefundenen Tweet verweisen, der dieses Schlüsselwort enthält. Diese werden der Datenbank mithilfe von .update () mit {upsert: true} hinzugefügt, so dass neue IDs an das Array 'ids' angehängt werden.

Ein Beispieldokument aus dieser Sammlung sieht folgendermaßen aus:

{     "_id": Objekt-ID ("4e00645ef58a7ad3fc9fd9f9"),     "IDs": ["ID1", "ID2", "ID3"],     "Stichwort": "#chocolate" }

Aktualisierungscode:

%Vor%

Die zweite Sammlung sieht so aus und wird einfach mit .save ()

hinzugefügt %Vor%

Ich habe das gerade auf meinem Macbook laufen und es läuft seit ungefähr 2 Stunden. Ich speichere ein Los von Daten, wahrscheinlich mehrere hundert Dokumente pro Minute. Momentan ist die Anzahl der Objekte in Mongodb 120.000.

Was ich bemerke, ist, dass die CPU-Nutzung für den Datenbankprozess 84% ​​erreicht und seit dem letzten Testlauf stetig gestiegen ist.

Ich habe beim Einstellen von Indizes nachgelesen, aber da ich Dokumente hinzufügen und keine Abfragen für sie ausführen kann, bin ich mir nicht sicher, ob Indizes helfen werden. Ein Nebengedanke, der mir auffiel, ist, dass update () möglicherweise eine Suche durchführt, da ich $ push benutze und dass ein Index dabei helfen könnte.

Was sollte ich beachten, um zu verhindern, dass MongoDB immer mehr CPU verbraucht?

    
Geuis 21.06.2011, 10:43
quelle

2 Antworten

6

Sie sind auf dem richtigen Weg. Der Abfrageteil Ihres Updates benötigt einen Index, andernfalls wird ein Tabellenscan ausgeführt. Ein Einrückungsindex für das Keyword. Sie werden feststellen, dass sich die Update-Leistung erheblich erhöht.

    
Brendan W. McAdams 21.06.2011, 11:56
quelle
9

Es ist sehr wahrscheinlich, dass Sie in MongoDB einen sehr häufigen Flaschenhals treffen. Da Sie Dokumente sehr häufig aktualisieren, indem Sie Zeichenfolgen hinzufügen, ist die Wahrscheinlichkeit groß, dass der Speicherplatz für dieses Dokument knapp wird und die Datenbank gezwungen ist, dieses Dokument ständig an einen anderen Platz in memory \ disk zu verschieben, indem es am Ende neu geschrieben wird der Datendatei.

Das Hinzufügen von Indizes kann nur die Schreibleistung beeinträchtigen, so dass die Leistung nicht verbessert wird, es sei denn, Sie werden schwer gelesen.

Ich würde in Erwägung ziehen, Ihre Anwendungslogik zu ändern, um dies zu tun:

  1. Index für das Schlüsselwortfeld
  2. Bevor Sie jedes Mal, wenn Sie einen Tweet entdecken, etwas in die Datenbank einfügen, suchen Sie nach dem Dokument, das das Schlüsselwort enthält. Wenn es nicht existiert, fügen Sie ein neues Dokument ein, aber packen Sie die Eigenschaft ids , indem Sie eine ganze Reihe falscher Strings in das Array einfügen. Entfernen Sie dann sofort nach dem Einfügen alle IDs aus diesem Array. Dies wird dazu führen, dass mongodb zusätzlichen Raum für das gesamte Dokument zuweist, so dass, wenn Sie IDs zum id-Feld hinzufügen, es viel Platz zum Wachsen haben wird.
  3. Fügen Sie die ID des Tweets in das ids -Feld
  4. ein
Bryan Migliorisi 21.06.2011 14:33
quelle

Tags und Links