Wanneer u explain(true)
. gebruikt u kunt zien dat de optimizer overweegt om indexkruising te gebruiken en ervoor kiest om dit niet te doen:
"cursor" : "BtreeCursor Age", // Chosen plan.
...
"allPlans" : [
{
"cursor" : "BtreeCursor Age",
...
},
{
"cursor" : "BtreeCursor Name",
...
},
{
"cursor" : "Complex Plan", // Index intersection.
...
}
]
MongoDB
zal nooit een kruising kiezen als er een voldoende samengestelde index is. Andere beperkingen zijn te vinden op het Jira-ticket voor Index Intersection:
De query-optimizer kan indexkruisingsplannen selecteren als aan de volgende voorwaarden wordt voldaan:
1. De meeste documenten in de relevante collectie zijn schijfresident. Het voordeel van indexkruising is dat het kan voorkomen dat volledige documenten worden opgehaald wanneer de grootte van het kruispunt klein is. Als de documenten al in het geheugen staan, is er niets te winnen door ophaalacties te vermijden.
2. De querypredikaten zijn enkelpuntsintervallen, in plaats van bereikpredikaten of een reeks intervallen. Query's over intervallen van één punt retourneren documenten gesorteerd op schijflocatie, waardoor de optimizer plannen kan selecteren die de kruising op een niet-blokkerende manier berekenen. Dit is over het algemeen sneller dan de alternatieve manier om de kruising te berekenen, namelijk het bouwen van een hashtabel met de resultaten van de ene index en deze vervolgens onderzoeken met de resultaten van de tweede index.
3. Geen van de te snijden indices is zeer selectief. Als een van de indices selectief is, kiest de optimizer een plan dat deze selectieve index eenvoudig scant.
4. De grootte van de kruising is klein in verhouding tot het aantal indexsleutels dat door beide oplossingen met één index wordt gescand. In dit geval kan de uitvoerder van de query een kleinere set documenten bekijken met behulp van index-intersectie, waardoor we mogelijk de vruchten kunnen plukken van minder ophaalacties van schijf.
MongoDB
heeft veel beperkingen op kruispunten, waardoor het minder waarschijnlijk is dat het daadwerkelijk wordt gebruikt.