2012-05-04 6 views
1

J'ai une collection dans un mongoDB sur lequel j'ai défini les préférences utilisateur. J'ai un très grand nombre d'objets dans une collection particulière, et l'utilisateur peut suivre une clé dans la collection. Par exemple:Évaluation des performances mongo DB

colletionx { key1: value1, key2: value2 : key3: value3 .. keyn:valuen} 

Maintenant, l'utilisateur peut suivre un certain nombre de clés, à savoir quand key1 est égal à une valeur me mettre à jour. (Très similaire à la fonction "suivre" de Twitter).

Maintenant, comment puis-je le faire efficacement?

Aussi, si je fais une recherche mongo avec une requête comme ceci:

db.collection.find({ keyId : 290}) 

ou db.collection.find({ keyId : { $in [ 290] } }) ce qu'il y aura une amélioration de la performance drastique quand il y a des millions d'utilisateurs et suivent tous 1 montrent.

Répondre

1

Je pense que l'une des plus grandes inquiétudes à avoir de grandes quantités de données dans une base de données est que lorsque vous interrogez, vous voulez éviter de frapper le disque. Mongodb fait un assez bon travail de conservation des données en mémoire, mais si vos données dépassent votre mémoire, vous commencerez à échanger et cela nuira à vos performances.

Il ne devrait pas y avoir beaucoup de différence entre faire une requête $eq et une requête $in tant qu'il y a un index sur la clé que vous interrogez. S'il n'y a pas d'index, vous effectuerez une analyse de collection complète.

0

Pour une grande quantité de données, il est fortement recommandé de travailler avec Sharding Cela vous permettra d'avoir les données séparées entre les fragments, ainsi votre index pourrait s'adapter à la mémoire RAM. Je pense que findOne by index devrait être assez efficace. La seule chose qui peut nuire à vos performances dans ce cas est seulement des écritures massives en plus de vos opérations de lectures. Puisque le mongo a un verrou global.