Quando usi explain(true)
puoi vedere che l'ottimizzatore considera l'utilizzo dell'intersezione dell'indice e sceglie di non:
"cursor" : "BtreeCursor Age", // Chosen plan.
...
"allPlans" : [
{
"cursor" : "BtreeCursor Age",
...
},
{
"cursor" : "BtreeCursor Name",
...
},
{
"cursor" : "Complex Plan", // Index intersection.
...
}
]
MongoDB
non sceglierà mai l'intersezione se c'è un indice composto sufficiente. Altre limitazioni possono essere trovate sul biglietto Jira per Index Intersection:
Query Optimizer può selezionare piani di intersezione dell'indice quando si verificano le seguenti condizioni:
1. La maggior parte dei documenti nella raccolta pertinente sono residenti su disco. Il vantaggio dell'intersezione dell'indice è che può evitare di recuperare documenti completi quando le dimensioni dell'intersezione sono ridotte. Se i documenti sono già in memoria, non c'è nulla da guadagnare evitando i recuperi.
2. I predicati della query sono intervalli a punto singolo, anziché predicati di intervallo o un insieme di intervalli. Le query su intervalli di un singolo punto restituiscono documenti ordinati in base alla posizione del disco, il che consente all'ottimizzatore di selezionare piani che calcolano l'intersezione in modo non bloccante. Questo è generalmente più veloce della modalità alternativa di calcolo dell'intersezione, che consiste nel creare una tabella hash con i risultati di un indice e quindi sondarla con i risultati del secondo indice.
3. Nessuno degli indici da intersecare è altamente selettivo. Se uno degli indici è selettivo, l'ottimizzatore sceglierà un piano che esegua semplicemente la scansione di questo indice selettivo.
4. La dimensione dell'intersezione è piccola rispetto al numero di chiavi di indice scansionate da una delle soluzioni a indice singolo. In questo caso, l'esecutore della query può esaminare un insieme più piccolo di documenti utilizzando l'intersezione dell'indice, consentendoci potenzialmente di sfruttare i vantaggi di un minor numero di recuperi dal disco.
MongoDB
ha molte limitazioni all'intersezione che lo rendono meno probabile che venga effettivamente utilizzato.