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

¿Por qué MongoDB no usa la intersección de índice?

Cuando usas explain(true) puede ver que el optimizador considera usar la intersección de índices y elige no:

"cursor" : "BtreeCursor Age", // Chosen plan.
...
"allPlans" : [
   {
       "cursor" : "BtreeCursor Age",
       ...
   },
   {
       "cursor" : "BtreeCursor Name",
       ...
   },
   {
       "cursor" : "Complex Plan", // Index intersection.
       ...
   }
]

MongoDB nunca elegirá la intersección si hay un índice compuesto suficiente. Se pueden encontrar otras limitaciones en el ticket de Jira para Index Intersection:

El optimizador de consultas puede seleccionar planes de intersección de índices cuando se cumplen las siguientes condiciones:
1. La mayoría de los documentos de la colección correspondiente residen en el disco. La ventaja de la intersección de índices es que puede evitar obtener documentos completos cuando el tamaño de la intersección es pequeño. Si los documentos ya están en la memoria, no se gana nada evitando las búsquedas.
2. Los predicados de consulta son intervalos de un solo punto, en lugar de predicados de rango o un conjunto de intervalos. Las consultas sobre intervalos de un solo punto devuelven documentos ordenados por ubicación de disco, lo que permite al optimizador seleccionar planes que calculan la intersección sin bloqueos. Por lo general, esto es más rápido que el modo alternativo de calcular la intersección, que consiste en crear una tabla hash con los resultados de un índice y luego probarla con los resultados del segundo índice.
3. Ninguno de los índices a intersectar son altamente selectivos. Si uno de los índices es selectivo, el optimizador elegirá un plan que simplemente escanea este índice selectivo.
4. El tamaño de la intersección es pequeño en relación con el número de claves de índice exploradas por cualquiera de las soluciones de índice único. En este caso, el ejecutor de consultas puede ver un conjunto más pequeño de documentos mediante la intersección de índices, lo que nos permite aprovechar los beneficios de menos recuperaciones del disco.

MongoDB tiene muchas limitaciones en la intersección, lo que hace que sea menos probable que se use.