Lassen Sie mich Ihnen ein paar Tipps geben, die auf meinem globalen Wissen und meiner Erfahrung basieren:
Verwenden Sie kürzere Feldnamen
MongoDB speichert für jedes Dokument denselben Schlüssel. Diese Wiederholung verursacht einen erhöhten Speicherplatz. Dies kann bei einer sehr großen Datenbank wie Ihrer zu Leistungsproblemen führen.
Vorteile:
- Kleinere Größe der Dokumente, also weniger Speicherplatz
- Mehr Dokument, um in den RAM zu passen (mehr Caching)
- Die Größe der do-Indizes wird in einigen Szenarien kleiner sein
Nachteile:
- Schwer lesbare Namen
Auf Indexgröße optimieren
Je kleiner die Indexgröße ist, desto mehr passt sie in den RAM und desto weniger Indexfehler treten auf. Betrachten Sie beispielsweise einen SHA1-Hash für Git-Commits. Ein Git-Commit wird oft durch die ersten 5-6 Zeichen dargestellt. Dann speichern Sie einfach die 5-6 Zeichen anstelle des gesamten Hashs.
Auffüllfaktor verstehen
Für Aktualisierungen im Dokument, die eine kostspielige Verschiebung des Dokuments verursachen. Diese Dokumentverschiebung verursacht das Löschen des alten Dokuments und das Aktualisieren an einem neuen leeren Ort und das Aktualisieren der Indizes, was kostspielig ist.
Wir müssen sicherstellen, dass sich das Dokument nicht bewegt, wenn ein Update stattfindet. Für jede Sammlung gibt es einen Padding-Faktor, der beim Einfügen des Dokuments angibt, wie viel zusätzlicher Platz neben der tatsächlichen Dokumentgröße zugewiesen werden muss.
Sie können den Collection-Padding-Faktor sehen mit:
db.collection.stats().paddingFactor
Füllung manuell hinzufügen
In Ihrem Fall sind Sie ziemlich sicher, dass Sie mit einem kleinen Dokument beginnen, das wachsen wird. Wenn Sie Ihr Dokument nach einiger Zeit aktualisieren, werden mehrere Dokumente verschoben. Fügen Sie also besser eine Polsterung für das Dokument hinzu. Leider gibt es keine einfache Möglichkeit, eine Polsterung hinzuzufügen. Wir können dies tun, indem wir beim Einfügen einige zufällige Bytes zu einem Schlüssel hinzufügen und diesen Schlüssel dann in der nächsten Aktualisierungsabfrage löschen.
Schließlich, wenn Sie sicher sind, dass einige Schlüssel in Zukunft zu den Dokumenten kommen werden, dann ordnen Sie diese Schlüssel mit einigen Standardwerten vor, so dass weitere Aktualisierungen nicht zu einer Zunahme der Dokumentgröße führen, die Dokumentverschiebungen verursacht.
Sie können Details über die Abfrage abrufen, die das Verschieben des Dokuments verursacht:
db.system.profile.find({ moved: { $exists : true } })
Große Anzahl von Sammlungen vs. große Anzahl von Dokumenten in wenigen Sammlungen
Schema ist etwas, das von den Anwendungsanforderungen abhängt. Wenn es eine riesige Sammlung gibt, in der wir nur die Daten der letzten N Tage abfragen, können wir uns optional für eine separate Sammlung entscheiden und alte Daten können sicher archiviert werden. Dadurch wird sichergestellt, dass das Caching im RAM ordnungsgemäß erfolgt.
Jede erstellte Sammlung verursacht Kosten, die höher sind als die Kosten für die Erstellung einer Sammlung. Jede Sammlung hat eine Mindestgröße von einigen KB + einem Index (8 KB). Jeder Sammlung ist ein Namespace zugeordnet, standardmäßig haben wir einige 24K-Namespaces. Beispielsweise ist eine Sammlung pro Benutzer eine schlechte Wahl, da sie nicht skalierbar ist. Irgendwann erlaubt uns Mongo nicht, neue Sammlungen von Indizes zu erstellen.
Im Allgemeinen hat das Vorhandensein vieler Sammlungen keine signifikante Leistungseinbuße. Beispielsweise können wir uns für eine Sammlung pro Monat entscheiden, wenn wir wissen, dass wir immer nach Monaten abfragen.
Denormalisierung von Daten
Es wird immer empfohlen, alle zugehörigen Daten für eine Abfrage oder eine Folge von Abfragen am selben Speicherort auf der Festplatte aufzubewahren. Sie müssen die Informationen in verschiedenen Dokumenten duplizieren. In einem Blog-Beitrag möchten Sie beispielsweise die Kommentare des Beitrags innerhalb des Beitragsdokuments speichern.
Vorteile:
- Die Indexgröße wird sehr gering sein, da die Anzahl der Indexeinträge geringer ist
- Die Abfrage wird sehr schnell sein, was das Abrufen aller notwendigen Details beinhaltet
- Die Dokumentgröße ist mit der Seitengröße vergleichbar, was bedeutet, dass wir, wenn wir diese Daten in den RAM bringen, die meiste Zeit keine anderen Daten mit auf die Seite bringen
- Das Verschieben von Dokumenten stellt sicher, dass wir eine Seite freigeben, nicht einen winzigen Teil der Seite, der möglicherweise nicht in weiteren Einfügungen verwendet wird
Begrenzte Sammlungen
Begrenzte Sammlungen verhalten sich wie Ringpuffer. Sie sind eine spezielle Art von Sammlungen mit fester Größe. Diese Sammlungen können mit sehr hoher Geschwindigkeit geschrieben und sequenziell gelesen werden. Da es sich um eine feste Größe handelt, werden die neuen Dokumente geschrieben, sobald der zugewiesene Speicherplatz gefüllt ist, indem die älteren gelöscht werden. Dokumentaktualisierungen sind jedoch nur zulässig, wenn das aktualisierte Dokument der ursprünglichen Dokumentgröße entspricht (spielen Sie mit Padding für mehr Flexibilität).