Além de índices escalares (ascendentes, descendentes), o MongoDB também suporta índices 'hashed'. Quando você usa um índice com hash em um campo, o MongoDB calcula um hash do valor do campo e armazena o hash no índice. Índices com hash dão suporte apenas à comparação de igualdade e não dão suporte a consultas de intervalo e normalmente são usados em cenários de fragmentação.
Criando um índice de hash do MongoDB
Você pode usar a seguinte sintaxe para criar um índice com hash:
db.collection.ensureIndex({'field':'hashed'});
Você pode criar um índice escalar e um índice com hash no mesmo campo.
Fragmentação do MongoDB
Normalmente, a fragmentação do MongoDB é implementada usando o particionamento "baseado em intervalo". Nessa abordagem, cada fragmento recebe um intervalo de valores da chave de fragmento. Se a chave de fragmento estiver aumentando monotonicamente como carimbos de data/hora ou objectID, isso às vezes pode resultar em um fragmento "quente", porque os valores mais recentes sempre acabam sendo roteados para o mesmo fragmento.
A maneira de contornar isso é usar o 'particionamento baseado em hash'. Um hash da chave de estilhaço é calculado e esse valor de hash é usado para rotear para um estilhaço em vez do valor real. Isso ajuda a distribuir a carga uniformemente em todos os fragmentos, em vez de enviar todos os dados mais recentes para o mesmo fragmento. O particionamento baseado em hash é implementado usando índices com hash em sua chave de fragmentação. Para obter mais informações, consulte a documentação de fragmentação.
Prós e contras do índice com hash
-
Prós
Os índices com hash tendem a ser menores do que os índices escalares porque apenas um hash da chave é armazenado em vez da chave completa. Por exemplo. Em um teste simples com 100k documentos, adicionamos índices escalares e hash em um campo de string – ‘fieldName’. Como mostrado abaixo, o índice hash tende a ser consideravelmente menor que os índices escalares:
"indexSizes" : { "_id_" : 811008, "firstName_1" : 4415488, "firstName_hashed" : 1490944 }
-
Contras
Não suporta consultas de intervalo. Se você executar uma consulta de intervalo em um índice com hash, isso resultará em uma verificação de índice.
Restrições de índice com hash
- Índices com hash não são compatíveis com matrizes.
- Índices com hash não podem ser índices compostos.
- Você não pode adicionar restrições exclusivas em índices com hash.