Mungo-Indizierung im Produktionscode


123

Gemäß der Mongoose- Dokumentation für MongooseJSund MongoDB/ Node.js:

Beim Start Ihrer Anwendung ruft Mongoose automatisch ensureIndexjeden definierten Index in Ihrem Schema auf. Obwohl dies für die Entwicklung hilfreich ist, wird empfohlen, dieses Verhalten in der Produktion zu deaktivieren, da die Indexerstellung erhebliche Auswirkungen auf die Leistung haben kann. Deaktivieren Sie das Verhalten, indem Sie die autoIndexOption Ihres Schemas auf false setzen.

Dies scheint die Entfernung der automatischen Indizierung von Mungo vor der Bereitstellung anzuweisen, um Mongoose davon abzuhalten, Mongo anzuweisen, beim Start der Anwendung alle Indizes zu durchsuchen, was sinnvoll erscheint.

Was ist der richtige Weg, um die Indizierung im Produktionscode zu handhaben? Vielleicht sollte ein externes Skript Indizes generieren? Oder ist es möglicherweise ensureIndexunnötig, wenn eine einzelne Anwendung der einzige Leser / Schreiber einer Sammlung ist, weil sie bei jedem DB-Schreibvorgang einen Index fortsetzt?

Edit: Um zu ergänzen, bietet MongoDB gute Dokumentation für die , wie die Indizierung zu tun, aber nicht , warum oder wenn explizite Indexierung Richtlinien durchgeführt werden sollten. Es scheint mir, dass Indizes von Writer-Anwendungen für Sammlungen mit vorhandenen Indizes automatisch auf dem neuesten Stand gehalten werden sollten, und das ensureIndexist eher eine einmalige Sache (erfolgt, wenn ein neuer Index angewendet wird). In diesem Fall sollte Mongoose autoIndexeine sein no-op bei einem normalen Serverneustart.

Antworten:


133

Ich habe nie verstanden, warum in der Mongoose-Dokumentation die Deaktivierung autoIndexin der Produktion so allgemein empfohlen wird . Sobald der Index hinzugefügt wurde, sehen nachfolgende ensureIndexAufrufe einfach, dass der Index bereits vorhanden ist, und kehren dann zurück. Dies wirkt sich also nur beim ersten Erstellen des Index auf die Leistung aus. Zu diesem Zeitpunkt sind die Sammlungen häufig leer, sodass das Erstellen eines Index ohnehin schnell vonstatten geht.

Mein Vorschlag ist, autoIndexaktiviert zu lassen, es sei denn, Sie haben eine bestimmte Situation, in der es Ihnen Probleme bereitet. Zum Beispiel, wenn Sie einer vorhandenen Sammlung mit Millionen von Dokumenten einen neuen Index hinzufügen möchten und mehr Kontrolle darüber haben möchten, wann sie erstellt wird.


10
Ich muss eine Frage hinzufügen ... Was ist, wenn ich sie falsch gesetzt habe? Dann werden die Indizes erstellt, wenn ich die Daten einfüge oder explizit erstellen muss. Es tut mir leid, wenn dies eine Anfängerfrage ist, aber es wäre wirklich hilfreich, wenn Sie antworten würden.
Saransh Mohapatra

5
@SaranshMohapatra Wenn autoIndexfalse ist, müssen Sie sureIndexes für Ihr Modell aufrufen , um dessen Indizes zu erstellen.
JohnnyHK

Dann muss ich es jedes Mal aufrufen oder nur einmal das Modell definieren?
Saransh Mohapatra

@SaranshMohapatra, wenn Sie Ihr Modell definieren (kompilieren). Ich mache das, wenn ich die App zum ersten Mal starte. Jetzt ist es schwierig zu entscheiden, alle Indizes zu löschen und neu zu erstellen, falls Sie das Schema ändern.
Moss

3
@JohnnyHK stimmst du deiner Antwort jetzt, da es fast 2016 ist, immer noch zu?
Alexander Mills

41

Obwohl ich der akzeptierten Antwort zustimme, ist es erwähnenswert, dass dies laut MongoDB-Handbuch nicht die empfohlene Methode zum Hinzufügen von Indizes auf einem Produktionsserver ist:

Wenn Ihre Anwendung sureIndex () -Operationen enthält und für andere betriebliche Belange kein Index vorhanden ist, kann das Erstellen des Index schwerwiegende Auswirkungen auf die Leistung der Datenbank haben.

Um Leistungsprobleme zu vermeiden, stellen Sie sicher, dass Ihre Anwendung beim Start mit der Methode getIndexes () oder der entsprechenden Methode für Ihren Treiber nach den Indizes sucht und diese beendet, wenn die richtigen Indizes nicht vorhanden sind. Erstellen Sie während der festgelegten Wartungsfenster immer Indizes in Produktionsinstanzen mit separatem Anwendungscode.

Natürlich hängt es wirklich davon ab, wie Ihre Anwendung strukturiert und bereitgestellt ist. Wenn Sie beispielsweise auf Heroku bereitstellen und die Preboot-Funktion von Heroku nicht verwenden , werden Ihre Anwendungen wahrscheinlich während des Startvorgangs überhaupt keine Anforderungen bearbeiten. Daher ist es wahrscheinlich sicher, zu diesem Zeitpunkt einen Index zu erstellen.

Darüber hinaus aus der akzeptierten Antwort:

Dies wirkt sich also nur beim ersten Erstellen des Index auf die Leistung aus. Zu diesem Zeitpunkt sind die Sammlungen häufig leer, sodass das Erstellen eines Index ohnehin schnell vonstatten geht.

Wenn Sie es geschafft haben, Ihr Datenmodell und Ihre Abfragen beim ersten Mal festzunageln, ist dies in Ordnung und häufig der Fall. Wenn Sie Ihrer App jedoch neue Funktionen mit einer neuen DB-Abfrage für eine Eigenschaft ohne Index hinzufügen, werden Sie häufig einen Index zu einer Sammlung hinzufügen, die viele vorhandene Dokumente enthält.

Dies ist die Zeit, in der Sie beim Hinzufügen von Indizes vorsichtig sein und die Auswirkungen auf die Leistung sorgfältig berücksichtigen müssen. Sie können den Index beispielsweise im Hintergrund erstellen :

db.ensureIndex({ name: 1 }, { background: true });

3
Ok, alles, was Sie tun müssen, ist, Ihren Server NICHT zu starten, bis alle sureIndex-Rückrufe für jede Sammlung ausgelöst wurden.
Alexander Mills

@AlexMills wie stellen Sie das sicher?
Lonelymo

async.each (Object.keys (Modelle), Funktion (Schlüssel, cb) {Modelle [Schlüssel] .ensureIndexes (cb)}, cb)
Alexander Mills

Rufen Sie einfach sureIndexes für jedes Mungomodell auf, warten Sie, bis alle fertig sind, und starten Sie dann Ihren Server. Ich empfehle auch, auf DB-Verbindungen zu warten, bevor Sie Ihren Server starten
Alexander Mills

2
Es gibt keine ensureIndexmehr. Es gibt createIndexstattdessen. Habe ich recht?
Jack Blank

1

Verwenden Sie diesen Blockcode, um den Produktionsmodus zu handhaben:

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.