Lascia che ti dia un paio di suggerimenti basati sulla mia conoscenza ed esperienza globale:
Utilizza nomi di campo più brevi
MongoDB memorizza la stessa chiave per ogni documento. Questa ripetizione provoca un aumento dello spazio su disco. Questo può avere qualche problema di prestazioni su un database molto grande come il tuo.
Pro:
- Meno dimensione dei documenti, quindi meno spazio su disco
- Più documenti da inserire nella RAM (più cache)
- La dimensione degli indici do sarà inferiore in alcuni scenari
Contro:
- Nomi meno leggibili
Ottimizza sulla dimensione dell'indice
Minore è la dimensione dell'indice, più si adatta alla RAM e meno si verifica la mancanza di indice. Si consideri ad esempio un hash SHA1 per i commit git. Un git commit è molte volte rappresentato dai primi 5-6 caratteri. Quindi memorizza semplicemente i 5-6 caratteri invece di tutti gli hash.
Comprendi il fattore di riempimento
Per gli aggiornamenti che si verificano nel documento che causano costosi spostamenti del documento. Questo documento si sposta provocando l'eliminazione del vecchio documento e l'aggiornamento in una nuova posizione vuota e l'aggiornamento degli indici che è costoso.
Dobbiamo assicurarci che il documento non si muova se si verificano degli aggiornamenti. Per ogni collezione è coinvolto un fattore di riempimento che indica, durante l'inserimento del documento, quanto spazio extra deve essere allocato oltre alle dimensioni effettive del documento.
Puoi vedere il fattore di riempimento della raccolta utilizzando:
db.collection.stats().paddingFactor
Aggiungi un riempimento manualmente
Nel tuo caso sei abbastanza sicuro di iniziare con un piccolo documento che crescerà. L'aggiornamento del documento dopo un po' provocherà lo spostamento di più documenti. Quindi è meglio aggiungere un riempimento per il documento. Sfortunatamente, non esiste un modo semplice per aggiungere un'imbottitura. Possiamo farlo aggiungendo alcuni byte casuali a una chiave durante l'inserimento e quindi eliminando quella chiave nella prossima query di aggiornamento.
Infine, se sei sicuro che alcune chiavi arriveranno ai documenti in futuro, preallocare quelle chiavi con alcuni valori predefiniti in modo che ulteriori aggiornamenti non provochino l'aumento delle dimensioni del documento causando spostamenti del documento.
Puoi ottenere dettagli sulla query che causa lo spostamento del documento:
db.system.profile.find({ moved: { $exists : true } })
Grande numero di raccolte VS grande numero di documenti in poche raccolte
Lo schema è qualcosa che dipende dai requisiti dell'applicazione. Se esiste una vasta raccolta in cui interroghiamo solo gli ultimi N giorni di dati, allora possiamo opzionalmente scegliere di avere una raccolta separata e i vecchi dati possono essere archiviati in modo sicuro. Ciò assicurerà che la memorizzazione nella cache della RAM venga eseguita correttamente.
Ogni collezione creata comporta un costo che è superiore al costo di creazione della collezione. Ciascuna raccolta ha una dimensione minima che è di pochi KB + un indice (8 KB). Ogni raccolta ha uno spazio dei nomi associato, per impostazione predefinita abbiamo alcuni spazi dei nomi 24K. Ad esempio, avere una raccolta per Utente è una cattiva scelta poiché non è scalabile. Dopo un certo punto Mongo non ci permetterà di creare nuove raccolte di indici.
In genere, avere molte raccolte non comporta una significativa penalizzazione delle prestazioni. Ad esempio, possiamo scegliere di avere una raccolta al mese, se sappiamo che eseguiamo sempre query in base ai mesi.
Denormalizzazione dei dati
È sempre consigliabile mantenere tutti i dati correlati per una query o una sequenza di query nella stessa posizione del disco. Hai bisogno di duplicare le informazioni su documenti diversi. Ad esempio, in un post del blog, vorrai memorizzare i commenti del post all'interno del documento del post.
Pro:
- La dimensione dell'indice sarà molto inferiore poiché il numero di voci dell'indice sarà inferiore
- La query sarà molto veloce e include il recupero di tutti i dettagli necessari
- Le dimensioni del documento saranno paragonabili alle dimensioni della pagina, il che significa che quando portiamo questi dati nella RAM, la maggior parte delle volte non portiamo altri dati lungo la pagina
- Lo spostamento del documento farà in modo che stiamo liberando una pagina, non un piccolo pezzetto nella pagina che potrebbe non essere utilizzato in ulteriori inserti
Raccolte limitate
La raccolta limitata si comporta come buffer circolari. Sono un tipo speciale di collezioni di dimensioni fisse. Queste raccolte possono ricevere scritture e letture sequenziali ad altissima velocità. Essendo a dimensione fissa, una volta riempito lo spazio assegnato, i nuovi documenti vengono scritti cancellando quelli più vecchi. Tuttavia, gli aggiornamenti del documento sono consentiti solo se il documento aggiornato si adatta alle dimensioni del documento originale (gioca con il riempimento per una maggiore flessibilità).