2012-09-14 5 views
5

Sto eseguendo la seguente query e sono necessari in media 9 secondi per restituire i risultati. Non ci sono filtri su di esso, quindi non sono sicuro che un indice potrebbe aiutare. Perché funziona così lentamente? Ci sono solo 250 oggetti e solo 4 campi (tutto il testo).Perché collections.find ({}) richiede più di 9 secondi per 250 oggetti (MongoMapper)

Country.collection.find({},:fields => ['country_name', 'country_code']).to_json 

"cursor":"BasicCursor", 
"nscanned":247, 
"nscannedObjects":247, 
"n":247, 
"millis":0, 
"nYields":0, 
"nChunkSkips":0, 
"isMultiKey":false, 
"indexOnly":false, 
"indexBounds":{}, 
"allPlans":[{"cursor":"BasicCursor","indexBounds":{}}] 

La CPU, memoria e disco sulla macchina non si accorgono neppure la corsa query. Qualsiasi aiuto sarebbe apprezzato.

+3

hai provato a eseguire la stessa query in mongo shell? – soulcheck

+0

no, a dire il vero non ho molta esperienza nella shell di mongo, quali modifiche di sintassi dovrei fare in modo che vengano trattate come la stessa query? – ABrowne

+0

qualcosa come: 'db.countries.find ({}, {'country_name': 1, 'country_code': 1})' – soulcheck

risposta

3

Creare indici sulla 'country_name' fiels utilizzando:

db.countries.ensureIndex({country_name:1}); 

che accelererà enormemente la vostra richiesta si può imparare di più su indici here

PS- è possibile digitare 'it' per visualizzare più quando vedi la frase 'ha più', oppure puoi visualizzare tutto il risultato senza 'ha di più' usando:

db.countries.find({}, {'country_name' : 1, 'country_code' : 1}).forEach(printjson) 

e si può sempre impostare il profiler utilizzando:

>use databaseName; 
> db.setProfilingLevel(2); // 2 tell the profiler to catch everything happened inside the DB 

si può imparare di più su profiler here

ed è possibile visualizzare i dati all'interno del profiler utilizzando

> db.system.profile.find() 

Questo metodo darà maggiori informazioni sul tuo database e su cosa sta succedendo all'interno.

+3

Grazie, eseguendo db.countries.find ({}, {'country_name': 1, 'country_code': 1}). ForEach (printjson) nella shell viene eseguito e restituisce tutti i risultati in millisecondi, come mi aspetterei mongo a.Sto per installare un profiler sul mio stack di rubini è vedere che cosa sta causando una query che dovrebbe eseguire in millisecondi eseguire in pochi secondi. – ABrowne

+0

Fammi sapere se la creazione dell'indice accelera la tua query, è una grande funzionalità di mongodb. – mongotop

+4

purtroppo no, ma si scopre che non era mongo, ma il driver rubino e to_json che stava rallentando le cose. Ho finito con il caching del risultato JSON che funziona davvero bene. Ora l'intera chiamata Ajax completa da capo a capo entro 70 ms – ABrowne

Problemi correlati