MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Warum verwendet MongoDB keine Indexüberschneidung?

Wenn Sie explain(true) verwenden Sie können sehen, dass der Optimierer die Indexüberschneidung in Betracht zieht und sich dagegen entscheidet:

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

MongoDB wird niemals eine Schnittmenge wählen, wenn ein ausreichender zusammengesetzter Index vorhanden ist. Weitere Einschränkungen finden Sie im Jira-Ticket für Index Intersection:

Der Abfrageoptimierer kann Indexschnittpläne auswählen, wenn die folgenden Bedingungen erfüllt sind:
1. Die meisten Dokumente in der relevanten Sammlung sind plattenresident. Der Vorteil der Indexüberschneidung besteht darin, dass das Abrufen vollständiger Dokumente vermieden werden kann, wenn die Größe der Überschneidung klein ist. Wenn die Dokumente bereits im Speicher sind, bringt es nichts, Abrufe zu vermeiden.
2. Die Abfrageprädikate sind einzelne Punktintervalle und keine Bereichsprädikate oder ein Satz von Intervallen. Abfragen über einzelne Punktintervalle geben Dokumente zurück, die nach Plattenspeicherort sortiert sind, wodurch der Optimierer Pläne auswählen kann, die die Schnittmenge auf nicht blockierende Weise berechnen. Dies ist im Allgemeinen schneller als die alternative Methode zur Berechnung der Schnittmenge, die darin besteht, eine Hash-Tabelle mit den Ergebnissen aus einem Index zu erstellen und sie dann mit den Ergebnissen aus dem zweiten Index zu untersuchen.
3. Keiner der zu schneidenden Indizes ist hochgradig selektiv. Wenn einer der Indizes selektiv ist, wählt der Optimierer einen Plan aus, der einfach diesen selektiven Index scannt.
4. Die Größe der Schnittmenge ist klein im Verhältnis zur Anzahl der Indexschlüssel, die von jeder Einzelindexlösung gescannt werden. In diesem Fall kann der Query Executor einen kleineren Satz von Dokumenten mithilfe der Indexüberschneidung betrachten, wodurch wir möglicherweise die Vorteile von weniger Abrufen von der Festplatte nutzen können.

MongoDB hat viele Beschränkungen für die Schnittmenge, wodurch es weniger wahrscheinlich ist, dass sie tatsächlich verwendet wird.