2012-11-15 20 views
16

Prima di tutto, so che a questa domanda:MongoDB riutilizza lo spazio eliminato?

Auto compact the deleted space in mongodb?

La mia domanda non è nello sminuire le dimensioni dei file DB, però, ma di più il riutilizzo dello spazio cancellato. Supponiamo di avere 100K di documenti in una raccolta, quindi ne elimino 50K. Mongo riutilizzerà lo spazio all'interno del suo file di dati che i documenti cancellati hanno liberato? O sono semplicemente "contrassegnati" come cancellati?

Non mi interessa molto delle dimensioni effettive del file su disco, più di "cresce e cresce".

risposta

20

Aggiornamento (marzo 2015): A partire dalla versione 3.0, ci sono più storage engines disponibili in MongoDB. Questa risposta si applica al motore di archiviazione MMAP (ancora predefinito in MongoDB 3.0), la risposta per altri motori (WiredTiger per esempio) è abbastanza diversa e potrebbe essere sintonizzabile e regolabile. Quindi, se si sta utilizzando un altro motore, leggere i documenti rilevanti per quel motore di archiviazione per determinare quale spazio riutilizzare i valori predefiniti e le opzioni.

Con il motore di archiviazione MMAP, quando si eliminano i documenti, lo spazio lasciato viene inserito in una lista libera. Tuttavia, per usare lo spazio ci dovranno essere documenti di dimensioni simili inseriti successivamente, e MongoDB dovrà trovare uno spazio appropriato per quel documento entro un certo periodo di tempo (una volta scaduto guardando l'elenco, verrà aggiunto solo) altrimenti il riutilizzo dello spazio non accadrà molto spesso. Questa cancellazione viene eseguita all'interno dei file di dati, quindi non vi è alcuna richiesta di spazio su disco - ciò avviene internamente all'interno dei file di dati esistenti.

Se successivamente si esegue uno repair o resync a secondary da zero, i file di dati vengono riscritti e lo spazio sul disco verrà recuperato (anche eventuali spaziature sui documenti verranno rimosse). Qui è dove si vedrà lo spazio reale di recupero su disco. Per qualsiasi altra azione (compact inclusa) l'utilizzo del disco non cambierà e potrebbe persino aumentare.

Con 2.2+ è ora possibile utilizzare l'e l'opzione collMod commandusePowersOf2Sizes per rendere il riutilizzo dello spazio cancellato più probabile (si noti che questo è il default in 2.6 +). Ciò significa che l'allocazione dello spazio iniziale per un documento è un po 'meno efficiente (ad esempio, 512 byte per un documento da 400 byte) ma significa che quando viene inserito un nuovo documento è più probabile che sia in grado di riutilizzarlo. Se si eliminano (o crescono e quindi si spostano) i documenti molto, questo sarà più efficiente a lungo termine.

Per chiunque sia interessato, una delle persone che hanno scritto un sacco di codice di stoccaggio (Mathias Stearn) ha una grande presentazione riguardo la struttura interna di storage, che può essere found here

Problemi correlati