El Explicar que losresultados del plan para las consultas están sujetos a cambios entre las versiones de MongoDB.
El
cursor.explain("executionStats")Los db.collection.explain("executionStats") métodos y proporcionan estadísticas sobre el rendimiento de una consulta. Estas estadísticas pueden ser útiles para medir si una consulta utiliza un índice y cómo lo hace. Consulte para obtener más db.collection.explain() información.
MongoDB Compass ofrece una pestaña "Explicar el plan", que muestra estadísticas sobre el rendimiento de una consulta. Estas estadísticas pueden ser útiles para medir si una consulta utiliza un índice y cómo lo hace.
Evaluar el rendimiento de una query
Considere una colección inventory con los siguientes documentos:
db.inventory.insertMany ( [ { _id: 1, item: "f1", type: "food", quantity: 500 }, { _id: 2, item: "f2", type: "food", quantity: 100 }, { _id: 3, item: "p1", type: "paper", quantity: 200 }, { _id: 4, item: "p2", type: "paper", quantity: 150 }, { _id: 5, item: "f3", type: "food", quantity: 300 }, { _id: 6, item: "t1", type: "toys", quantity: 500 }, { _id: 7, item: "a1", type: "apparel", quantity: 250 }, { _id: 8, item: "a2", type: "apparel", quantity: 400 }, { _id: 9, item: "t2", type: "toys", quantity: 50 }, { _id: 10, item: "f4", type: "food", quantity: 75 } ] )
Los documentos aparecen en MongoDB Compass de la siguiente manera:

Consulta sin índice
La siguiente consulta recupera documentos donde el campo quantity tiene un valor entre 100 y 200, inclusive:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )
La query devuelve los siguientes documentos:
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 3, "item" : "p1", "type" : "paper", "quantity" : 200 } { "_id" : 4, "item" : "p2", "type" : "paper", "quantity" : 150 }
Para ver el plan de consulta seleccionado, encadene el cursor.explain("executionStats") método del cursor al final del comando de búsqueda:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
explain() devuelve los siguientes resultados:
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'COLLSCAN', ... } } }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 0, totalDocsExamined: 10, executionStages: { stage: 'COLLSCAN', ... }, ... }, ... }
queryPlanner.winningPlan.queryPlan.stagemuestraCOLLSCANpara indicar un escaneo de colección.Los análisis de la colección indican que tuvo que analizar toda la colección, documento por documento, para identificar los resultados. Esta operación suele ser costosa y puede generar consultas lentas.
mongodexecutionStats.nReturnedmuestra3para indicar que el plan de consulta ganador devuelve tres documentos.executionStats.totalKeysExaminedmuestra0para indicar que esta consulta no utiliza un índice.executionStats.totalDocsExaminedexhibe10para indicar que MongoDB tuvo que escanear diez documentos (es decir, todos los documentos de la colección) para encontrar los tres documentos coincidentes.
La siguiente consulta recupera documentos donde el campo quantity tiene un valor entre 100 y 200, inclusive:
Copia el siguiente filtro en la barra de query de Compass y haz clic Find:
{ quantity: { $gte: 100, $lte: 200 } }
La query devuelve los siguientes documentos:
Para ver el plan de consulta seleccionado:
Haga clic en la pestaña Explain Plan para la colección
test.inventory.Haga clic en Explain.
MongoDB Compass muestra el plan de consulta de la siguiente manera:

Nota
Debido a que estamos trabajando con un conjunto de datos tan pequeño para los fines de este tutorial, Actual Query Execution Time muestra 0 segundos, aunque no estemos usando un índice.
En un dataset más grande, la diferencia en el tiempo de ejecución de la query entre una query indexada frente a una no indexada sería mucho más significativa.
Árbol visual
El Query Performance Summary muestra las estadísticas de ejecución de la consulta:
Documents Returned muestra
3para indicar que el plan de consulta ganador devuelve tres documentos.Index Keys Examined muestra
0para indicar que esta consulta no está utilizando un índice.Documents Examined muestra
10para indicar que MongoDB tuvo que escanear diez documentos (es decir, todos los documentos de la colección) para encontrar los tres documentos coincidentes.
Debajo de Query Performance Summary, MongoDB Compass muestra la etapa de consulta
COLLSCANpara indicar que se utilizó un escaneo de colección para esta consulta.Los análisis de la colección indican que tuvo que analizar toda la colección, documento por documento, para identificar los resultados. Esta operación suele ser costosa y puede generar consultas lentas.
mongod
Raw JSON
Los detalles de la explicación también se pueden ver en formato JSON sin procesar haciendo clic en Raw JSON debajo de la barra de consulta:

La diferencia entre el número de documentos coincidentes y el número de documentos examinados puede sugerir que, para mejorar la eficiencia, la consulta podría beneficiarse del uso de un índice.
Consulta con índice
Para admitir la query en el campo quantity, añada un índice en el campo quantity:
db.inventory.createIndex( { quantity: 1 } )
Para ver las estadísticas del plan de consulta, utilice el explain() método:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
El método devuelve los siguientes explain() resultados:
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { quantity: 1 }, ... } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 3, executionTimeMillis: 0, totalKeysExamined: 3, totalDocsExamined: 3, executionStages: { ... }, ... }, ... }
queryPlanner.winningPlan.queryPlan.inputStage.stagemuestraIXSCANpara indicar el uso del índice.executionStats.nReturnedmuestra3para indicar que el plan de consulta ganador devuelve tres documentos.executionStats.totalKeysExaminedmuestra3para indicar que MongoDB escaneó tres entradas de índice. El número de claves examinadas coincide con el número de documentos devueltos, lo que significa quemongodsolo tuvo que examinar las claves de índice para obtener los resultados.mongodno tuvo que escanear todos los documentos, y solo los tres documentos coincidentes tuvieron que cargarse en memoria. Esto resulta en una consulta muy eficiente.executionStats.totalDocsExaminedmuestra3para indicar que MongoDB escaneó tres documentos.
Haga clic en la pestaña Indexes para la colección
test.inventory.Haga clic en Create Index.
Selecciona
quantitydel menú desplegable Select a field name.Seleccione
1 (asc)del menú desplegable de tipo.Haga clic en Create.
Nota
Dejar el campo de nombre de índice en blanco hace que MongoDB Compass cree un nombre predeterminado para el índice.
Ahora puede ver el índice recién creado en la pestaña Indexes:

Regrese a la pestaña Explain Plan de la colección inventory y vuelva a ejecutar la consulta del paso anterior:
{ quantity: { $gte: 100, $lte: 200 } }
MongoDB Compass muestra el plan de consulta de la siguiente manera:

Árbol visual
El Query Performance Summary muestra las estadísticas de ejecución de la consulta:
Documents Returned muestra
3para indicar que el plan de consulta ganador devuelve tres documentos.Index Keys Examined
3Muestra para indicar que MongoDB escaneó tres entradas de índice. El número de claves examinadas coincide con el número de documentos devueltos, lo que significa quemongodsolo tuvo que examinar las claves de índice para obtener los resultados.mongodno tuvo que escanear todos los documentos, y solo los tres documentos coincidentes tuvieron que cargarse en memoria. Esto resulta en una consulta muy eficiente.Documents Examined muestra
3para indicar que MongoDB escaneó tres documentos.En el lado derecho del Query Performance Summary, MongoDB Compass muestra que la query usó el índice
quantity.
Debajo Query Performance Summary de, MongoDB Compass muestra las etapas de consulta
FETCHIXSCANy.IXSCANindica que utilizó un índice para satisfacer la consulta antes de ejecutarmongodlaFETCHetapa y recuperar los documentos.
Raw JSON
Los detalles de la explicación también se pueden ver en formato JSON sin procesar haciendo clic en Raw JSON debajo de la barra de consulta:

Sin el índice, la consulta escanearía toda la colección de 10 documentos para devolver 3 documentos coincidentes. La consulta también tendría que escanear cada documento en su totalidad, lo que podría generar un almacenamiento en memoria. Esto resulta en una consulta costosa y potencialmente lenta.
Cuando se ejecuta con un índice, la consulta escanea 3 entradas de índice y 3 documentos para devolver 3 documentos coincidentes, lo que da como resultado una consulta muy eficiente.
Comparar el rendimiento de los índices
Para comparar manualmente el rendimiento de una consulta utilizando más de un índice, puede utilizar el método hint() explain() junto con el método.
Considera el siguiente query:
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } )
La query devuelve los siguientes documentos:
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 5, "item" : "f3", "type" : "food", "quantity" : 300 }
Para respaldar la consulta, agregue un índice compuesto. Con índices compuestos, el orden de los campos es importante.
Por ejemplo, sume los dos índices compuestos siguientes. El primero ordena por el campo quantity y luego por el campo type. El segundo ordena por el campo type y luego por el campo quantity.
db.inventory.createIndex( { quantity: 1, type: 1 } ) db.inventory.createIndex( { type: 1, quantity: 1 } )
Evalúe el efecto del primer índice en la consulta:
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } ).hint({ quantity: 1, type: 1 }).explain("executionStats")
El método devuelve la siguiente explain() salida:
{ queryPlanner: { ... winningPlan: { queryPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { quantity: 1, type: 1 }, ... } } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 2, executionTimeMillis: 0, totalKeysExamined: 5, totalDocsExamined: 2, executionStages: { ... } }, ... }
MongoDB escaneó 5 claves de índice ( )executionStats.totalKeysExamined para 2 devolver documentos coincidentes (executionStats.nReturned).
Evaluar el efecto del segundo índice en la query:
db.inventory.find( { quantity: { $gte: 100, $lte: 300 }, type: "food" } ).hint({ type: 1, quantity: 1 }).explain("executionStats")
El método devuelve la siguiente explain() salida:
{ queryPlanner: { ... queryPlan: { winningPlan: { stage: 'FETCH', inputStage: { stage: 'IXSCAN', keyPattern: { type: 1, quantity: 1 }, ... } } }, rejectedPlans: [ ] }, executionStats: { executionSuccess: true, nReturned: 2, executionTimeMillis: 0, totalKeysExamined: 2, totalDocsExamined: 2, executionStages: { ... } }, ... }
MongoDB escaneó 2 claves de índice ( )executionStats.totalKeysExamined para 2 devolver documentos coincidentes (executionStats.nReturned).
El segundo índice compuesto,, { type: 1, quantity: 1 } es por lo tanto el índice más eficiente para soportar la consulta de ejemplo, ya que el servidor MongoDB solo necesita escanear 2 index keys para encontrar todos los documentos coincidentes usando este índice, en comparación con 5 cuando se usa el índice { quantity: 1, type: 1 } compuesto.