MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB riutilizza lo spazio cancellato?

Aggiornamento (marzo 2015): A partire dalla versione 3.0, sono disponibili più motori di archiviazione in MongoDB. Questa risposta si applica al motore di archiviazione MMAP (ancora l'impostazione predefinita in MongoDB 3.0), la risposta per altri motori (ad esempio WiredTiger) è abbastanza diversa e potrebbe essere regolabile e regolabile. Pertanto, se stai utilizzando un altro motore, leggi i documenti pertinenti per quel motore di archiviazione per determinare quali sono le impostazioni e le opzioni predefinite per il riutilizzo dello spazio.

Con il motore di archiviazione MMAP, quando i documenti vengono eliminati, lo spazio lasciato viene inserito in un elenco libero. Tuttavia, per utilizzare lo spazio sarà necessario inserire successivamente documenti di dimensioni simili e MongoDB dovrà trovare uno spazio appropriato per quel documento entro un certo intervallo di tempo (una volta scaduto il timeout guardando l'elenco, verrà semplicemente aggiunto) altrimenti il riutilizzo dello spazio non avverrà molto spesso. Questa eliminazione viene eseguita all'interno dei file di dati, quindi qui non si verifica alcun recupero di spazio su disco:tutto ciò viene eseguito internamente all'interno dei file di dati esistenti.

Se successivamente si esegue una riparazione o si risincronizza un secondario da zero, i file di dati vengono riscritti e lo spazio su disco verrà recuperato (viene rimossa anche qualsiasi padding sui documenti). Qui è dove vedrai l'effettivo recupero dello spazio su disco. Per qualsiasi altra azione (comprese le compatte) l'utilizzo su disco non cambierà e potrebbe addirittura aumentare.

Con 2.2+ puoi ora usare il comando collMod e l'opzione usePowersOf2Sizes per rendere più probabile il riutilizzo dello spazio cancellato (nota che questo è l'impostazione predefinita in 2.6+). Ciò significa che l'allocazione dello spazio iniziale per un documento è un po' meno efficiente (512 byte per un documento da 400 byte, ad esempio), ma significa che quando viene inserito un nuovo documento è più probabile che sia in grado di riutilizzare quello spazio. Se elimini (o cresci e quindi sposti) molti documenti, questo sarà più efficiente a lungo termine.

Per chiunque sia interessato, una delle persone che ha scritto molto del codice di archiviazione (Mathias Stearn) ha un'ottima presentazione degli interni di archiviazione, che può essere trovata qui