sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Por qué los diferentes planes de consulta de MongoDB muestran diferentes valores nReturned?

Esto se explicó en el allPlansExecution Mode página de documentación. Parafraseando:

Durante la selección del plan, si hay más de un índice que puede satisfacer una consulta, MongoDB ejecutará una prueba utilizando todos los planes válidos para determinar cuál funcionó mejor. Consulte Planes de consulta para obtener detalles sobre este proceso.

A partir de MongoDB 3.4.6, la selección del plan implica ejecutar planes candidatos en paralelo en una "carrera" y ver qué plan candidato devuelve 101 resultados primero. En su ejemplo anterior, cuando el plan ganador arrojó 101 resultados en la carrera, el plan perdedor logró solo 2 resultados. El plan ganador luego se ejecuta hasta su finalización. Esta es la razón por la cual el plan perdedor muestra solo nReturned: 2 en las estadísticas.

Esta "carrera" se realiza ya que si hay dos planes de aspecto idéntico, MongoDB no sabe qué plan es el mejor para una consulta en particular debido a la flexibilidad de los documentos JSON (a diferencia de, por ejemplo, SQL, donde se conoce la estructura de las tablas) . Por supuesto, es muy posible que MongoDB adivine mal y termine con un plan de bajo rendimiento, ya que es un proceso empírico. Por esta razón, es mejor crear índices que admitan sus consultas para que MongoDB no tenga que adivinar. De lo contrario, puede usar hint() para decirle a MongoDB qué índice usar para una determinada consulta.

Por lo tanto:

  • Las estadísticas del plan ganador son las estadísticas de resultados de la consulta real.
  • Las estadísticas de los planes perdedores solo muestran las estadísticas de la ejecución de prueba de planificación de consultas.
  • La selección del plan implica realizar una "carrera" para obtener 101 resultados. Esta carrera solo se realiza cuando hay múltiples índices que pueden satisfacer la consulta.

Nota 1 :Ninguno de los dos planes que viste fueron geniales. El plan ganador muestra "nReturned" : 43 , "totalKeysExamined" : 221 y "totalDocsExamined" : 219 . Esto significa que MongoDB necesita examinar 219 documentos solo para devolver 43 de ellos:solo 20% de eficiencia . Idealmente, desea tener el nReturned números iguales a totalDocsExamined .

Nota 2 :Intente crear el índice compuesto {'rack_name': 1, 'timestamp': 1} . Con la misma consulta, debería obtener un mejor número de eficiencia.

Nota 3 :Tenga en cuenta que desde allPlansExecution se especificó, todos MongoDB le devuelve debidamente las estadísticas para que sean exhaustivas, mientras que no tiene ninguna relación con el nReturned final. resultado. Era un plan rechazado, y el nReturned: 2 número puede ser confuso No verá estas estadísticas si usa executionStats ajuste. Principalmente, allPlansExecution se utiliza para ajustar y determinar por qué se rechazan algunos planes.