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

Mise à jour d'un grand nombre d'enregistrements dans une collection

Permettez-moi de vous donner quelques conseils basés sur mes connaissances et mon expérience globale :

Utilisez des noms de champ plus courts

MongoDB stocke la même clé pour chaque document. Cette répétition entraîne une augmentation de l'espace disque. Cela peut avoir des problèmes de performances sur une très grande base de données comme la vôtre.

Avantages :

  • Moins de taille des documents, donc moins d'espace disque
  • Plus de documents pour tenir dans la RAM (plus de cache)
  • La taille des index do sera inférieure dans certains scénarios

Inconvénients :

  • Noms moins lisibles

Optimiser la taille de l'index

Plus la taille de l'index est petite, plus il rentre dans la RAM et moins il y a de manque d'index. Considérez un hachage SHA1 pour les commits git par exemple. Un commit git est plusieurs fois représenté par les 5-6 premiers caractères. Ensuite, stockez simplement les 5-6 caractères au lieu de tout le hachage.

Comprendre le facteur de rembourrage

Pour les mises à jour se produisant dans le document entraînant un déplacement coûteux du document. Ce déplacement de document entraîne la suppression de l'ancien document et sa mise à jour vers un nouvel emplacement vide et la mise à jour des index, ce qui est coûteux.

Nous devons nous assurer que le document ne bouge pas si une mise à jour se produit. Pour chaque collection, un facteur de remplissage est impliqué qui indique, lors de l'insertion du document, l'espace supplémentaire à allouer en dehors de la taille réelle du document.

Vous pouvez voir le facteur de remplissage de la collection en utilisant :

db.collection.stats().paddingFactor

Ajouter un rembourrage manuellement

Dans votre cas vous êtes à peu près sûr de commencer avec un petit document qui va grossir. La mise à jour de votre document après un certain temps entraînera plusieurs déplacements de documents. Il vaut donc mieux ajouter un rembourrage pour le document. Malheureusement, il n'y a pas de moyen facile d'ajouter un rembourrage. Nous pouvons le faire en ajoutant des octets aléatoires à une clé tout en insérant puis en supprimant cette clé dans la prochaine requête de mise à jour.

Enfin, si vous êtes sûr que certaines clés seront ajoutées aux documents à l'avenir, pré-allouez ces clés avec des valeurs par défaut afin que d'autres mises à jour n'entraînent pas une augmentation de la taille du document entraînant des déplacements de document.

Vous pouvez obtenir des détails sur la requête à l'origine du déplacement du document :

db.system.profile.find({ moved: { $exists : true } })

Grand nombre de collections VS grand nombre de documents dans peu de collections

Le schéma est quelque chose qui dépend des exigences de l'application. S'il existe une énorme collection dans laquelle nous n'interrogeons que les N derniers jours de données, nous pouvons éventuellement choisir d'avoir une collecte séparée et les anciennes données peuvent être archivées en toute sécurité. Cela garantira que la mise en cache dans la RAM est effectuée correctement.

Chaque collection créée entraîne un coût supérieur au coût de création de la collection. Chacune des collections a une taille minimale qui est de quelques Ko + un index (8 Ko). Chaque collection a un espace de noms associé, par défaut nous avons des espaces de noms de 24K. Par exemple, avoir une collection par utilisateur est un mauvais choix car elle n'est pas évolutive. Après un certain point, Mongo ne nous autorisera plus à créer de nouvelles collections d'index.

En règle générale, le fait d'avoir de nombreuses collections n'a aucune incidence significative sur les performances. Par exemple, nous pouvons choisir d'avoir une collecte par mois, si nous savons que nous interrogeons toujours en fonction des mois.

Dénormalisation des données

Il est toujours recommandé de conserver toutes les données associées pour une requête ou une séquence de requêtes au même emplacement sur le disque. Vous avez quelque chose besoin de dupliquer les informations sur différents documents. Par exemple, dans un article de blog, vous souhaiterez stocker les commentaires de l'article dans le document de l'article.

Avantages :

  • la taille de l'index sera très inférieure car le nombre d'entrées d'index sera inférieur
  • la requête sera très rapide, ce qui inclut la récupération de tous les détails nécessaires
  • la taille du document sera comparable à la taille de la page, ce qui signifie que lorsque nous apportons ces données dans la RAM, la plupart du temps, nous n'apportons pas d'autres données sur la page
  • le déplacement de document garantira que nous libérons une page, et non un petit morceau de la page qui ne sera peut-être pas utilisé dans d'autres insertions

Collections plafonnées

La collection plafonnée se comporte comme des tampons circulaires. Ce sont des types spéciaux de collections à taille fixe. Ces collections peuvent recevoir des écritures à très haut débit et des lectures séquentielles. Étant de taille fixe, une fois l'espace alloué rempli, les nouveaux documents sont écrits en supprimant les plus anciens. Cependant, les mises à jour de documents ne sont autorisées que si le document mis à jour correspond à la taille du document d'origine (jouez avec le rembourrage pour plus de flexibilité).