2012-09-14 5 views
5

Estoy ejecutando la siguiente consulta y tarda unos 9 segundos en devolver los resultados. No hay filtros, por lo que no estoy seguro de que un índice sea útil. ¿Por qué funciona tan lentamente? Solo hay 250 objetos allí y solo 4 campos (todo el texto).¿Por qué colecciones.find ({}) toma más de 9 segundos para 250 objetos (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, la memoria y el disco de la máquina ni siquiera notan la ejecución de la consulta. Cualquier ayuda sería apreciada.

+3

¿Intentó ejecutar la misma consulta en mongo shell? – soulcheck

+0

no, para ser honesto, no tengo mucha experiencia en el shell mongo, ¿qué cambios de sintaxis necesitaría hacer para que se tratara como la misma consulta? – ABrowne

+0

algo así como: 'db.countries.find ({}, {'country_name': 1, 'country_code': 1})' – soulcheck

Respuesta

3

crear índices en la COUNTRY_NAME fiels usando:

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

que acelerará enormemente la consulta Usted puede aprender más acerca de los índices here

PD- puede escribir 'eso' para mostrar más cuando ve la frase 'tiene más', o puede mostrar todo el resultado sin el 'tiene más' usando:

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

y siempre se puede configurar el generador de perfiles mediante el uso de:

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

Usted puede aprender más acerca de perfiles here

y se pueden visualizar los datos dentro del generador de perfiles utilizando

> db.system.profile.find() 

Este método le dará usted más información sobre su base de datos y lo que está sucediendo adentro.

+3

Gracias, ejecutando db.countries.find ({}, {'country_name': 1, 'country_code': 1}). ForEach (printjson) en el shell se ejecuta y devuelve todos los resultados en milisegundos, como era de esperar mongo a.Voy a instalar un generador de perfiles en mi pila de ruby ​​para ver qué está causando que una consulta que debe ejecutarse en milisegundos se ejecute en segundos. – ABrowne

+0

Avíseme si la creación del índice acelera su consulta, es una gran característica dentro de mongodb. – mongotop

+4

lamentablemente no, pero resulta que no era mongo, sino el controlador de ruby ​​y to_json que estaba ralentizando las cosas. Terminé almacenando en caché el resultado de json que funciona realmente bien. Ahora toda la llamada ajax completa de extremo a extremo dentro de los 70 ms – ABrowne

Cuestiones relacionadas