2011-03-08 13 views
5

he comenzado un nuevo proyecto usando Node.js y MongoDB y después de casi 2 días que reunió a unas 600 mil objetos en MongoDB. Ya estoy notando un gran impacto (negativo) en el rendimiento y estoy empezando a preocuparme si debería moverme a otro DB tanto como pueda, o si debería quedarme con Mongo y hacer algunas (más) optimizaciones.MongoDB funciona mal en 600k objetos, DB alternativo? optimizaciones?

coordenadas Básicamente Estoy almacenando así:

[x1] => 687 
[y1] => 167 
[x2] => 686 
[y2] => 167 
[c] => 0 
[s] => 0 
[m] => 1299430700312 
[_id] => MongoId Object (
    [$id] => 4d73bd2c82bb5926780001ec 
) 

No más ... y mis consultas aspecto:

{'$or': [ { x1: {'$gte' : 0, '$lt' : 1000 }, y1: {'$gte' : 0, '$lt' : 1000 } , { x2: {'$gte' : 0, '$lt' : 1000 }, y2: {'$gte' : 0, '$lt' : 1000 } } ] } 

He tratado de establecer el índice para cada una de las campos: x1, y1, y1, y1 así como para: {x1:1,y1:1},{x2:1,y2:1}. Además, también he buscado solo los campos obligatorios que necesito ... pero aún así, realizar una consulta con un conjunto de resultados de ~ 40k filas termina en un tiempo de ejecución de 2-8 segundos. Por cierto: realizar la misma consulta en PHP murió con un mensaje de falta de memoria (256 MB de RAM).

La máquina es una CPU Intel (R) Core (TM) i7 920 @ 2.67GHz con 8 GB de RAM, no es el más polvo en el estante;)

Realmente estoy quedando sin ideas y veo millones y millones de filas durante las próximas semanas. Como probablemente habrás notado, las filas son relativamente pequeñas. ¿Sería mejor MySQL con particiones? ¿Alguna otra base de datos NoSQL?

Y por favor al curricán de "2-8secs no es lento" - se está convirtiendo en un problema ya. Cuando un par de solicitudes no almacenadas caen en la máquina al mismo tiempo, la carga aumenta hasta 4 y menos de 10 usuarios accediendo a ella.

+4

¿Qué índices tiene configurados? Intente ejecutar su consulta en el intérprete de comandos y adjunte .explain() al final, que debe mostrarle el plan de consulta y los índices que están siendo aciertos. –

+3

No estoy del todo seguro de lo que está tratando de lograr con esta consulta, pero podría tener más suerte usando índices geoespaciales. http://www.mongodb.org/display/DOCS/Geospatial+Indexing –

+0

Suponiendo que esas coordenadas son, como se ve, las esquinas de los rectángulos, debe usar los índices geoespaciales de MongoDB: http://www.mongodb.org/ display/DOCS/Geospatial + Indexing –

Respuesta

9

Gracias a todos los que se tomaron el tiempo para pensar en mi problema. Las sugerencias de usar Índices Geoespaciales parecen ser la respuesta que estaba buscando. ¡Además del hecho de que los índices son más efectivos para mongodb, la forma de consultar cajas enteras es simple!

Para dar algunos datos: Acabo de comenzar a reescribir mi código y recopilar datos y comencé con una simple comparación. Mis datos antes eran los siguientes:


[x1] => 190 
[y1] => 18 
[x2] => 192 
[y2] => 18 
[c] => 0 
[s] => 0 
[b] => Array (
    [0] => 0 
    [1] => 0 
) 
[m] => 1299365242802 
[r] => 32596 
[_id] => MongoId Object (
    [$id] => 4d72bd7af0528ea82f000003 
) 

Los índices fueron:


{x1:1,y1:1}, {x2:1,y2:1} 

Ahora mis datos tiene el siguiente aspecto:


[_id] => MongoId Object (
    [$id] => 4d825799b15953b90d000000 
) 
[coords] => Array (
    [x] => 190 
    [y] => 18 
) 
[x2] => 192 
[y2] => 18 
[s] => 0 
[c] => 0 
[m] => 1299365242802 
[r] => 32596 

índice:


{coords:'2D'} 

comparé dos guiones Primero uno consulta un cuadro de 400x400 píxeles de la antigua colección y se tomó:

 


real 0m0.375s 
user 0m0.348s 
sys  0m0.021s 


segundo script utiliza el índice y consultas para el mismo cuadro pero utilizando el índice geoespacial:

 
real 0m0.107s 
user 0m0.096s 
sys  0m0.012s 

Esa es una gran diferencia y solo tengo alrededor de 3200 objetos en mis colecciones (cada uno). Mi base de datos/colección en vivo ya contiene casi 2 millones de objetos ahora (después de 12 días en línea). No puedo esperar para comparar los datos en vivo con estos scripts. ¡Me parece muy prometedor! :)

Gracias a todos, Stackoverflow rocks!)

+2

+1 Excelente seguimiento. – Greg

0

Una forma rápida y sucia de aumentar el rendimiento (en el sacrificio de memoria/espacio) sería index "x1", "x2", "y1" y "y2" pero quizás debería usar geospatial indexes.