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
sex
e cerchi uomini di nome Giovanni. Ridurresti lo spazio dei risultati di circa %50 solo se indicizzassi persex
primo. 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-cardinality
chiavi o mettihigh-cardinality
chiavi 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.