Redsandro,
Devi considerare la Index Cardinality e Selectivity .
1. Cardinalità dell'indice
La cardinalità dell'indice si riferisce a quanti valori possibili ci sono per un campo. Il campo sex ha solo due valori possibili. Ha una cardinalità molto bassa . Altri campi come names, usernames, phone numbers, emails , ecc. avranno un valore più unico per ogni documento nella raccolta, che è considerato alta cardinalità .
-
Maggiore cardinalità
Maggiore è la cardinalità di un campo, più utile sarà un indice, perché gli indici restringono lo spazio di ricerca, rendendolo un insieme molto più piccolo.
Se hai un indice su
sexe cerchi uomini di nome Giovanni. Ridurresti lo spazio dei risultati di circa %50 solo se indicizzassi persexprimo. Al contrario, se hai indicizzato pername, restringeresti immediatamente il set di risultati a una frazione minuscola di utenti di nome John, quindi faresti riferimento a quei documenti per verificare il sesso. -
Regola pratica
Prova a creare indici su
high-cardinalitychiavi o mettihigh-cardinalitychiavi prima nell'indice composto. Puoi saperne di più nella sezione sugli indici composti nel libro:MongoDB La guida definitiva
2. Selettività
Inoltre, si desidera utilizzare gli indici in modo selettivo e scrivere query che limitino il numero di documenti possibili con il campo indicizzato. Per semplificare, considera la seguente raccolta. Se il tuo indice è {name:1} , Se esegui la query { name: "John", sex: "male"} . Dovrai scansionare 1 documento. Perché hai permesso a MongoDB di essere selettivo.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Considera la seguente raccolta. Se il tuo indice è {sex:1} , Se esegui la query {sex: "male", name: "John"} . Dovrai scansionare 4 documenti.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Immagina le possibili differenze su un set di dati più ampio.
Una piccola spiegazione degli indici composti
È facile fare un'ipotesi sbagliata sugli indici composti. Secondo i documenti MongoDB sugli indici composti.
MongoDB supporta indici composti, dove un'unica struttura di indice contiene riferimenti a più campi all'interno dei documenti di una collezione. Il diagramma seguente illustra un esempio di indice composto su due campi:

Quando crei un indice composto, 1 indice conterrà più campi. Quindi, se indicizziamo una raccolta per {"sex" : 1, "name" : 1} , l'indice sarà più o meno simile a:
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
Se indicizziamo una raccolta per {"name" : 1, "sex" : 1} , l'indice sarà più o meno simile a:
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
Avere {name:1} poiché il prefisso ti servirà molto meglio nell'uso di indici composti. C'è molto altro da leggere sull'argomento, spero che questo possa offrire un po' di chiarezza.