sql >> Database >  >> NoSQL >> MongoDB

Hergebruikt MongoDB verwijderde ruimte?

Update (maart 2015): Vanaf de 3.0-release zijn er meerdere storage-engines beschikbaar in MongoDB. Dit antwoord is van toepassing op de MMAP-opslagengine (nog steeds de standaard in MongoDB 3.0), het antwoord voor andere engines (bijvoorbeeld WiredTiger) is heel anders en is mogelijk afstembaar en aanpasbaar. Als u dus een andere engine gebruikt, lees dan de relevante documenten voor die opslagengine om te bepalen wat de standaardinstellingen en opties voor het hergebruik van ruimte zijn.

Met de MMAP-opslagengine wordt de achtergebleven ruimte bij het verwijderen van documenten in een vrije lijst gezet. Om de ruimte te gebruiken, moeten er later documenten van vergelijkbare grootte worden ingevoegd, en MongoDB zal binnen een bepaald tijdsbestek een geschikte ruimte voor dat document moeten vinden (zodra het een time-out heeft om naar de lijst te kijken, wordt het gewoon toegevoegd) anders het hergebruik van de ruimte zal niet vaak gebeuren. Deze verwijdering gebeurt binnen de gegevensbestanden, dus er vindt hier geen terugvordering van schijfruimte plaats - dit alles gebeurt intern binnen de bestaande gegevensbestanden.

Als u vervolgens een reparatie uitvoert of een secundaire opnieuw synchroniseert, worden de gegevensbestanden herschreven en wordt de ruimte op de schijf teruggewonnen (elke opvulling op documenten wordt ook verwijderd). Hier ziet u de daadwerkelijke terugwinning van ruimte op de schijf. Voor alle andere acties (inclusief compact) zal het gebruik op schijf niet veranderen en kan zelfs toenemen.

Met 2.2+ kun je nu het collMod commando en de usePowersOf2Sizes optie gebruiken om het hergebruik van verwijderde ruimte waarschijnlijker te maken (merk op dat dit de standaard is in 2.6+). Dit betekent dat de aanvankelijke toewijzing van ruimte voor een document iets minder efficiënt is (512 bytes voor een document van 400 bytes bijvoorbeeld), maar betekent dat wanneer een nieuw document wordt ingevoegd, de kans groter is dat die ruimte opnieuw kan worden gebruikt. Als je veel documenten verwijdert (of laat groeien en dus verplaatsen), dan is dit op de lange termijn efficiënter.

Voor iedereen die geïnteresseerd is, heeft een van de mensen die veel van de opslagcode heeft geschreven (Mathias Stearn) een geweldige presentatie over de interne opslag, die hier te vinden is




  1. Redis-cache versus direct geheugen gebruiken

  2. Hulp nodig bij het conceptualiseren in Redis/NoSQL

  3. Memcached of Redis gebruiken op aws-elasticache

  4. Hoe kan ik de LIKE-operator op mangoest gebruiken?