Oltre agli indici scalari (crescente, decrescente), MongoDB supporta anche gli indici "hashing". Quando utilizzi un indice hash su un campo, MongoDB calcola un hash del valore del campo e memorizza l'hash nell'indice. Gli indici con hash supportano solo il confronto di uguaglianza e non supportano le query di intervallo e vengono in genere utilizzati negli scenari di partizionamento orizzontale.
Creazione di un indice hash MongoDB
Puoi utilizzare la seguente sintassi per creare un indice con hash:
db.collection.ensureIndex({'field':'hashed'});
Puoi creare sia un indice scalare che un indice hash sullo stesso campo.
Sharding MongoDB
In genere, il partizionamento orizzontale di MongoDB viene implementato utilizzando il partizionamento "basato sull'intervallo". In questo approccio, a ogni shard viene assegnato un intervallo di valori della chiave shard. Se la chiave shard aumenta in modo monotono come timestamp o objectID, a volte ciò può comportare uno shard "caldo" perché i valori più recenti finiscono sempre per essere indirizzati allo stesso shard.
Il modo per aggirare questo problema è usare il "partizionamento basato su hash". Viene calcolato un hash della chiave shard e questo valore hash viene utilizzato per indirizzare a uno shard anziché al valore effettivo. Questo aiuta a distribuire il carico in modo uniforme su tutti gli shard invece di inviare tutti i dati più recenti allo stesso shard. Il partizionamento basato su hash viene implementato utilizzando indici hash sulla chiave shard. Per ulteriori informazioni, fare riferimento alla documentazione di partizionamento orizzontale.
Pro e contro dell'indice hash
-
Pro
Gli indici hash tendono ad essere più piccoli degli indici scalari perché viene archiviato solo un hash della chiave invece della chiave completa. Per esempio. In un semplice test con 100.000 documenti, abbiamo aggiunto indici hash e scalari su un campo stringa:"fieldName". Come mostrato di seguito, l'indice hash tende ad essere considerevolmente più piccolo degli indici scalari:
"indexSizes" : { "_id_" : 811008, "firstName_1" : 4415488, "firstName_hashed" : 1490944 }
-
Contro
Non supporta le query di intervallo. Se esegui una query di intervallo su un indice con hash, verrà eseguita una scansione dell'indice.
Vincoli indice hash
- Gli indici con hash non supportano gli array.
- Gli indici con hash non possono essere indici composti.
- Non puoi aggiungere vincoli univoci agli indici con hash.