2011-08-22 9 views
1

Dans mongo dbMongoDB Trouver() FullScan avec Index

> show dbs 
admin (empty) 
data 23.9423828125GB 
local (empty) 

J'ai une table avec un index:

> db.XXX.count(); 
80089670 

C#:

voteCol.EnsureIndex("({ YYY:1 })"); 

Quand je fais une requête avec le pilote C#:

MongoCollection<BsonDocument> voteCol = database.GetCollection<BsonDocument>("XXX"); 
var query = new QueryDocument("YYY", DataUtils.getItemInPollIdList()); 
MongoCursor<BsonDocument> cursor =  voteCol.Find(query).SetSortOrder(SortBy.Descending("ZZZ")).SetLimit(10).SetSkip(20); 

Le temps d'exécution de cette partie du code est proche de 0.

Puis, quand je suis en train d'obtenir la taille du curseur

cursor.Size(); 

Je reçois un délai d'attente.

Impossible de lire les données de la connexion de transport: Une connexion tentative a échoué car le parti connecté n'a pas répondu correctement après une période de temps, ou une connexion établie a échoué car hôte connecté n'a pas répondu.

Dans Mongo log

Lun 22 août 10:08:50 [conn9] requête data.XXX ntoreturn: 1 reslen: 36 nscanned: 80089670 {YYY: "1482092"} nreturned: 0 48935ms

Qu'est-ce que c'est? Lorsque la requête est vraiment exécutée? Pourquoi je ne peux pas obtenir les résultats?

Edit 1: nouvel indice Ajouté

Lun 22 août 10:17:38 [conn12] la construction de nouveaux index sur {({YYY: -1}): 1} pour data.XXX

  4000000/80089670  4% 
      7866400/80089670  9% 
      11403000/80089670  14% 
      15000000/80089670  18% 
      19000000/80089670  23% 
      22988600/80089670  28% 
      26454700/80089670  33% 
      30000000/80089670  37% 
      33438600/80089670  41% 
      37000000/80089670  46% 
      40810600/80089670  50% 
      44132200/80089670  55% 
      48000000/80089670  59% 
      52000000/80089670  64% 
      55618300/80089670  69% 
      59000000/80089670  73% 
      62170100/80089670  77% 
      66000000/80089670  82% 
      70000000/80089670  87% 
      74000000/80089670  92% 
      77874500/80089670  97% 

même avec le nouvel indice - même numéro: shell mongo:

> printjson(db.XXX.findOne({YYY:"1517077"})); 

MongoLog

Mon Aug 22 10:33:40 [conn4] query data.XXX ntoreturn:1 reslen:36 nscanned:80089670 { YYY: "1517077" } nreturned:0 48751ms 
+0

Il a scanné 80 millions de documents, cela prend beaucoup de temps) –

+0

@Hohhi Pourquoi? J'ai ajouté un index. Pouvez-vous expliquer l'analyse complète? – JohnJohnGa

+0

c'est ce qu'il a écrit dans le journal: nscanné: 80089670 –

Répondre

1

J'ai fait une erreur - tout est sensible à la casse dans mongoDb. J'ai ajouté un index sur yyy au lieu de YYY.

Aucun message d'avertissement même si je n'ai rien nommé yyy dans la table et l'index a été créé avec succès :(.

J'ai recréé un index sur le nom de colonne correct. Tout est rapide maintenant.

1

La taille du curseur renvoie sa taille en octets. Ce que vous devriez être intéressé afin d'empêcher toutes les analyses est le nombre de documents. Utilisez cet extrait:

collection.FindAll().Count(); 
+0

+1 pour les conseils - regardez ma réponse :(:) – JohnJohnGa