2016-07-16 20 views
0

Wir haben eine MongoDB mit Hunderttausenden von Dokumenten, wobei jede von ihnen mehrere Felder enthält, einschließlich eines Arrays, das im Laufe der Zeit zunimmt (ein zusätzlicher Eintrag pro Tag, wobei jeder Eintrag eine ganze Zahl und ein Datum enthält) .MongoDB Dokumentenspeicheroptimierung

Um die Geschwindigkeit der täglichen Aktualisierung der Dokumente zu optimieren, wäre es sinnvoll, mehr Speicherplatz pro Dokument zu reservieren, sodass das Dokument nicht jedes Mal verschoben werden muss, wenn wir einen Eintrag zum Array hinzufügen.

+0

Nicht genau, was Sie fragen, aber das ist ziemlich breit und meinungsfordernd. Niemand kennt Ihre genauen Hardwarespezifikationen (es ist durchaus möglich, dass Sie die Leistung erhöhen können, indem Sie Hardware auf das Problem werfen). Es gibt auch mögliche Schema-Updates, die Ihre Leistung verbessern könnten (und das einzige, was wir wissen, ist, dass Sie ein Array verwenden, das Sie aktualisieren. Wie geschrieben, ist dies nicht Thema. –

+0

@DavidMakogon Es ist keine Frage um Meinungen Die MMAPv1-Speicher-Engine von MongoDB ermöglicht es, zusätzlichen Speicherplatz für Dokumente vorzubelegen, was wiederum verhindert, dass Dokumentmigrationen stattfinden können. Daher ist die Frage aus diesem Teil machbar. Und es gibt sogar eine einfache Antwort auf die Frage, da das Dokument monoton zunimmt . –

Antwort

1

Vorbelegung Platz hilft Ihnen nicht zu viel in dieser Situation. Da Ihre Dokumente früher oder später über den Auffüllbereich hinaus zunehmen, wird es trotzdem zu Dokumentmigrationen kommen. Mit einem hohen Padding-Faktor erhöhen Sie jedoch den Overhead in Bezug auf die Festplattennutzung und potenziell auch erheblich.

Ihr Datenmodell ist fehlerhaft. Für ein potenziell unendliches Feld sollten Sie eine zweite Sammlung für die täglichen Ereignisse verwenden, die sich auf das Basisdokument bezieht.

{ 
    _id: baseDocId, 
    … 
} 

würde Ihr Basisdokument sein, dann, und

{ 
    _id: dailyEventId, 
    base: baseDocId, 
    date: someISODate, 
    … 
} 

ein Dokument für ein einzelnes Ereignis. Es ist immer noch einfach, alle Ereignisse für eine bekannte Basis

db.events.find({base: baseDocId}) 

aber Sie mit dem Dokument Migrationen keine Probleme haben, zu erhalten, wenn ein neues Ereignis hinzufügen, brauchen nicht Ihr padding-Overhead zu erhöhen und Sie erhalten vorbei an der 16MB Dokument Größenbeschränkung , auch.