Pregunta MongoDB funciona mal en 600k objetos, DB alternativa? optimizaciones?


Comencé un nuevo proyecto usando node.js y mongodb y después de casi 2 días reuní alrededor de 600k objetos en MongoDB. Ya estoy notando un gran impacto (negativo) en el rendimiento y estoy empezando a preocuparme si debo pasar a otro DB tanto como pueda, o si debo seguir con Mongo y hacer algunas (más) optimizaciones.

Básicamente estoy almacenando coordenadas como esta:

[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 se ven así:

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

He intentado establecer el índice para cada uno de los campos: x1, y1, y1, y1, así como para: {x1:1,y1:1},{x2:1,y2:1}. Además, también solo obtuve los campos requeridos 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 a 8 segundos. Por cierto: realizar la misma consulta en PHP murió con un mensaje de memoria insuficiente (256 MB de RAM).

La máquina es una CPU Intel (R) Core (TM) i7 920 @ 2.67GHz con 8GB de RAM, no es la más polvorienta del rack;)

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

Y, por favor, consultar sobre "2-8 segundos no es lento", ya se está convirtiendo en un problema. Cuando un par de solicitudes no capturadas llegan a la máquina al mismo tiempo, la carga aumenta hasta 4 y menos de 10 usuarios acceden a ella.


5
2018-03-08 00:52


origen


Respuestas:


Gracias a todos ustedes 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 cuadros completos simplemente es increíble!

Para dar algunos datos: Acabo de comenzar a reescribir mi código y los datos de la colección y comencé con una comparación simple. Mi información anterior se veía así:


[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 se ven así:


[_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 scripts. El primero consulta una caja de 400x400 píxeles de la colección anterior y tomó:



0m0.375s reales
usuario 0m0.348s
sys 0m0.021s


La segunda secuencia de comandos utiliza el índice y las consultas para la misma casilla pero utilizando el índice geoespacial:

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

Esa es una gran diferencia y solo tengo alrededor de 3200objetos 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! )


9
2018-03-17 19:06



Una forma rápida y sucia de aumentar el rendimiento (sacrificando memoria / espacio) sería índice "x1", "x2", "y1" y "y2", pero quizás debas usar índices geoespaciales.


0
2018-03-09 16:28