stages - MongoDB{aggregation $ match} vs{find} velocidad
mongodb project (2)
¿Has intentado utilizar explain () para tus consultas de búsqueda? Te dará una buena idea de cuánto tiempo llevará exactamente la búsqueda de find (). Puede hacer lo mismo para $ match con $ explain y ver si hay alguna diferencia en el acceso al índice y otros parámetros.
Además, la parte de $ group del marco de agregación no utiliza la indexación, por lo que debe procesar todos los registros devueltos por la etapa $ matching del marco de agregación. Para comprender mejor el funcionamiento de su consulta, vea el conjunto de resultados que devuelve y si encaja en la memoria para ser procesado por MongoDB.
Tengo una colección mongoDB con millones de filas y estoy tratando de optimizar mis consultas. Actualmente estoy usando el marco de agregación para recuperar datos y agruparlos como quiera. Mi típica consulta de agregación es algo así como: $match > $group > $ group > $project
Sin embargo, noté que las últimas partes solo toman unos pocos ms, el comienzo es el más lento.
Intenté realizar una consulta con solo el filtro $ match y luego realizar la misma consulta con collection.find. La consulta de agregación requiere ~ 80 ms mientras que la consulta de búsqueda tarda 0 o 1 ms.
Tengo índices en casi todos los campos, así que supongo que este no es el problema. Alguna idea sobre lo que podría salir mal? ¿O es simplemente un inconveniente "normal" del marco de agregación?
Podría usar buscar consultas en lugar de consultas de agregación, sin embargo, tendría que realizar un gran procesamiento después de la solicitud y este proceso se puede hacer rápidamente con $group
etc., así que preferiría mantener el marco de agregación.
Gracias,
EDITAR:
Aquí está mi criterio:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
El objetivo principal del aggregation framework
es facilitar la consulta de un gran número de entradas y generar un bajo número de resultados que le valgan valor.
Como ha dicho, también puede usar múltiples consultas de búsqueda, pero recuerde que no puede crear nuevos campos con las consultas de búsqueda. Por otro lado, la etapa $group
permite definir sus nuevos campos.
Si desea obtener la funcionalidad del aggregation framework
, lo más probable es que tenga que ejecutar un find
inicial (o encadenar varios), extraer esa información y manipularla con un lenguaje de programación.
El proceso de aggregation pipeline
puede parecer más lento, pero al menos usted sabe que solo debe tener en cuenta el rendimiento de un sistema: el motor MongoDB.
Mientras que, cuando se trata de manipular los datos devueltos de una consulta de búsqueda, lo más probable es que tenga que manipular aún más los datos con un lenguaje de programación, aumentando así la complejidad según las complejidades del lenguaje de programación de elección.