MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pourquoi MongoDB n'utilise-t-il pas l'intersection d'index ?

Lorsque vous utilisez explain(true) vous pouvez voir que l'optimiseur envisage d'utiliser l'intersection d'index et choisit de ne pas :

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

MongoDB ne choisira jamais l'intersection s'il y a un index composé suffisant. D'autres limitations peuvent être trouvées sur le ticket Jira pour Index Intersection :

L'optimiseur de requête peut sélectionner des plans d'intersection d'index lorsque les conditions suivantes sont remplies :
1. La plupart des documents de la collection pertinente résident sur disque. L'avantage de l'intersection d'index est qu'elle peut éviter de récupérer des documents complets lorsque la taille de l'intersection est petite. Si les documents sont déjà en mémoire, il n'y a rien à gagner à éviter les récupérations.
2. Les prédicats de requête sont des intervalles de point unique, plutôt que des prédicats de plage ou un ensemble d'intervalles. Les requêtes sur des intervalles de points uniques renvoient des documents triés par emplacement de disque, ce qui permet à l'optimiseur de sélectionner des plans qui calculent l'intersection de manière non bloquante. Ceci est généralement plus rapide que le mode alternatif de calcul de l'intersection, qui consiste à construire une table de hachage avec les résultats d'un index, puis à la tester avec les résultats du second index.
3. Aucun des indices à croiser n'est hautement sélectif. Si l'un des index est sélectif alors l'optimiseur choisira un plan qui scanne simplement cet index sélectif.
4. La taille de l'intersection est petite par rapport au nombre de clés d'index analysées par l'une ou l'autre des solutions à index unique. Dans ce cas, l'exécuteur de la requête peut examiner un plus petit ensemble de documents à l'aide de l'intersection d'index, ce qui nous permet potentiellement de récolter les bénéfices d'un nombre réduit de récupérations à partir du disque.

MongoDB a de nombreuses limitations sur l'intersection, ce qui la rend moins susceptible d'être réellement utilisée.