mongodb - ¿Por qué la sugerencia de Mongo hace que una consulta se ejecute hasta 10 veces más rápido?
indexing hint (3)
Luché por encontrar razón para lo mismo. Descubrí que cuando tenemos muchos índices, Mongo está tomando más tiempo que usando una sugerencia. Básicamente, Mongo lleva mucho tiempo decidiendo qué índice usar. Piense en un escenario en el que tenga 40 índices y realice una consulta. La primera tarea que debe realizar Mongo es qué índice es el más adecuado para utilizarlo en una consulta en particular. Esto implicaría que Mongo necesita escanear todas las claves, así como realizar algunos cálculos en cada escaneo para encontrar algún índice de rendimiento si se usa esta clave. La sugerencia definitivamente se acelerará ya que se guardará la exploración de la clave de índice.
Si ejecuto una consulta de Mongo desde el shell con explique (), obtengo el nombre del índice usado y luego ejecuto la misma consulta nuevamente, pero con hint () especificando el mismo índice que se usará - el campo "milis" del plan de explicación es disminuyó significativamente
por ejemplo
no se proporciona ninguna pista:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 24,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
sugerencia proporcionada:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 2,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
La única diferencia es el campo "millis".
¿Alguien sabe por qué es eso?
ACTUALIZACIÓN: "Seleccionar qué índice usar" no lo explica, porque mongo, por lo que sé, selecciona el índice para cada X (100?) Ejecuciones, por lo que debería ser tan rápido como con la siguiente sugerencia (X-1) carreras
Mongo hizo la misma búsqueda las dos veces que puede ver en el número de objetos escaneados. También puede ver que el índice usado era el mismo (eche un vistazo a la entrada del "cursor"), ambos ya utilizaron su índice my_super_index.
"pista" solo le dice a Mongo que use ese índice específico que ya hizo automáticamente en la primera consulta.
La segunda búsqueda fue simple más rápida porque probablemente todos los datos ya estaban en el caché.
Mongo usa un algoritmo para determinar qué índice se utilizará cuando no se proporcione una pista y luego almacena en caché el índice utilizado para la consulta similar para las próximas 1000 llamadas.
Pero siempre que explique una consulta de Mongo, siempre ejecutará el algoritmo de selección de índice, por lo tanto, la explicación () con sugerencia siempre tomará menos tiempo en comparación con la explicación () sin sugerencia.
Una pregunta similar fue respondida aquí Entendiendo mongo db explicar