MongoDB ‘count ()’ est très lent. Comment pouvons-nous affiner / travailler avec elle?

J’utilise actuellement MongoDB avec des millions d’enregistrements de données. J’ai découvert une chose assez ennuyeuse.

Lorsque j’utilise la fonction “count ()” avec un petit nombre de données collectées, c’est très rapide. Cependant, lorsque la collecte de données interrogée contient des milliers voire des millions d’enregistrements de données, le système entier devient très lent.

Je me suis assuré que j’ai indexé les champs requirejs.

Quelqu’un at-il rencontré une chose identique? Comment faites-vous pour améliorer cela?

Il existe maintenant une autre optimisation que la création d’un index approprié.

db.users.ensureIndex({name:1}); db.users.find({name:"Andrei"}).count(); 

Si vous avez besoin de compteurs, je suggère de les précalculer chaque fois que possible. En utilisant une opération atomic $ inc et ne pas utiliser count({}) du tout.

Mais les mongodb qui travaillent dur sur mongodb, donc, count({}) améliorations qu’ils prévoient dans mongodb 2.1 selon le bug de jira.

Vous pouvez vous assurer que l’index est réellement utilisé sans aucun access au disque.

Disons que vous voulez compter les enregistrements avec le nom: “Andrei”

Vous vous assurez de l’index sur le nom (comme vous l’avez fait) et

 db.users.find({name:"andrei"}, {_id:0, name:1}).count() 

vous pouvez vérifier que c’est le moyen le plus rapide de compter (sauf lors de la précalcul) en vérifiant si

 db.users.find({name:"andrei"}, {_id:0, name:1}).explain() 

affiche un champ index_only défini sur true.

Cette astuce fera en sorte que votre requête récupère uniquement les enregistrements de ram (index) et non du disque.

Pour moi, la solution consistait à changer d’indice en Cela dépend de la situation spécifique, essayez-le si vous le pouvez.

 db.Account.createIndex( { "date_checked_1": 1 }, { sparse: true } ) db.Account.find({ "dateChecked" : { $exists : true } }).count() 

318 milliers de notices dans la collection

  • 0,31 sec – avec indice clairsemé
  • 0,79 sec – avec index non clairsemé

Vous êtes plutôt malchanceux pour l’instant, le fait de compter dans mongodb est affreux et ne s’améliorera pas dans un avenir proche. Voir: https://jira.mongodb.org/browse/SERVER-1752

D’expérience, vous ne devriez pratiquement jamais l’utiliser, sauf si c’est une chose unique, quelque chose qui se produit très rarement ou si votre firebase database est plutôt petite.

Comme l’a dit @Andrew Orsich, utilisez des compteurs chaque fois que cela est possible (la chute des compteurs est le locking global de l’écriture, mais mieux que count ()).