MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB réutilise-t-il l'espace supprimé ?

Mise à jour (mars 2015) : Depuis la version 3.0, plusieurs moteurs de stockage sont disponibles dans MongoDB. Cette réponse s'applique au moteur de stockage MMAP (toujours la valeur par défaut dans MongoDB 3.0), la réponse pour les autres moteurs (WiredTiger par exemple) est assez différente et pourrait bien être réglable et ajustable. Par conséquent, si vous utilisez un autre moteur, veuillez lire les documents pertinents pour ce moteur de stockage afin de déterminer quelles sont les valeurs par défaut et les options de réutilisation de l'espace.

Avec le moteur de stockage MMAP, lorsque des documents sont supprimés, l'espace restant est mis dans une liste libre. Cependant, pour utiliser l'espace, il faudra insérer des documents de taille similaire plus tard, et MongoDB devra trouver un espace approprié pour ce document dans un certain laps de temps (une fois qu'il aura expiré en regardant la liste, il s'ajoutera simplement) sinon la réutilisation de l'espace ne se produira pas très souvent. Cette suppression est effectuée dans les fichiers de données, il n'y a donc pas de récupération d'espace disque ici - tout cela est fait en interne dans les fichiers de données existants.

Si vous effectuez ensuite une réparation ou resynchronisez un secondaire à partir de zéro, les fichiers de données sont réécrits et l'espace sur le disque sera récupéré (tout rembourrage sur les documents est également supprimé). C'est là que vous verrez la récupération d'espace réelle sur le disque. Pour toute autre action (compact inclus), l'utilisation du disque ne changera pas et pourra même augmenter.

Avec 2.2+, vous pouvez désormais utiliser la commande collMod et l'option usePowersOf2Sizes pour rendre la réutilisation de l'espace supprimé plus probable (notez qu'il s'agit de la valeur par défaut dans 2.6+). Cela signifie que l'allocation d'espace initiale pour un document est un peu moins efficace (512 octets pour un document de 400 octets par exemple) mais signifie que lorsqu'un nouveau document est inséré, il est plus susceptible de pouvoir réutiliser cet espace. Si vous supprimez (ou augmentez et donc déplacez) beaucoup de documents, cela sera plus efficace à long terme.

Pour toute personne intéressée, l'une des personnes qui a écrit une grande partie du code de stockage (Mathias Stearn) a une excellente présentation sur les composants internes du stockage, qui peut être trouvée ici