MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

In che modo l'ordine degli indici composti è importante in MongoDB dal punto di vista delle prestazioni?

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 per sex primo. Al contrario, se hai indicizzato per name , 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 metti high-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.