sql >> Databasteknik >  >> NoSQL >> MongoDB

Återanvänder MongoDB borttaget utrymme?

Uppdatering (mars 2015): Från och med 3.0-versionen finns det flera lagringsmotorer tillgängliga i MongoDB. Det här svaret gäller MMAP-lagringsmotorn (fortfarande standard i MongoDB 3.0), svaret för andra motorer (WiredTiger till exempel) är helt annorlunda och kan mycket väl vara inställbart och justerbart. Om du använder en annan motor, läs därför de relevanta dokumenten för den lagringsmotorn för att avgöra vilka standarder och alternativ du har för återanvändning av utrymme.

Med MMAP-lagringsmotorn, när dokument raderas läggs det kvarlämnade utrymmet i en ledig lista. Men för att använda utrymmet kommer det att behöva läggas in dokument av samma storlek senare, och MongoDB kommer att behöva hitta ett lämpligt utrymme för det dokumentet inom en viss tidsram (när det tar tid att titta på listan, kommer det bara att läggas till) annars återanvändning av utrymme kommer inte att ske särskilt ofta. Denna radering görs i datafilerna, så det sker ingen återvinning av diskutrymme här - allt detta görs internt i de befintliga datafilerna.

Om du därefter gör en reparation, eller synkroniserar om en sekundär från början, skrivs datafilerna om och utrymmet på disken kommer att återtas (ev utfyllnad på dokument tas också bort). Det är här du kommer att se faktisk utrymmesåtervinning på disken. För andra åtgärder (inklusive kompakt) kommer användningen på disken inte att ändras och kan till och med öka.

Med 2.2+ kan du nu använda kommandot collMod och alternativet usePowersOf2Sizes för att göra återanvändning av borttaget utrymme mer sannolikt (observera att detta är standard i 2.6+). Detta betyder att den initiala utrymmestilldelningen för ett dokument är lite mindre effektiv (512 byte för ett dokument på 400 byte till exempel) men betyder att när ett nytt dokument infogas är det mer sannolikt att det kan återanvända det utrymmet. Om du raderar (eller växer och därmed flyttar) dokument mycket, kommer detta att vara mer effektivt på lång sikt.

För alla som är intresserade, en av personerna som skrev mycket av lagringskoden (Mathias Stearn) har en bra presentation om lagringsinternerna, som finns här




  1. Hur man söker i array of object i mongodb

  2. 2 sätt att ta bort en samling i MongoDB

  3. Hur hideIndex() fungerar i MongoDB

  4. Hur fyller man i kapslade enheter i mongoose?