MongoDB Academy · Aula

Estratégias de fragmentação por intervalo e por hash

Você configurará uma coleção com fragmentação por intervalo para consultas por intervalo ou por hash para distribuição uniforme das gravações e comparará suas vantagens e desvantagens.

Aula 3 de 413 etapas

Estratégias de fragmentação por intervalo e por hash é uma aula grátis de MongoDB Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de MongoDB Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de MongoDB Academy inclui 4 aulas no total.

Comparação entre duas estratégias de fragmentação

O MongoDB oferece duas estratégias integradas de fragmentação: fragmentação por intervalo e fragmentação por hash. A fragmentação por intervalo atribui intervalos contíguos de valores da chave de fragmentação a fragmentos específicos; a fragmentação por hash aplica primeiro uma função de hash à chave e distribui os dados com base nesse hash. Ambas têm vantagens distintas, e a escolha correta depende dos padrões de acesso aos seus dados.

Fragmentação por intervalo: como funciona

Na fragmentação por intervalo, o MongoDB divide o espaço de valores da chave de fragmentação em intervalos contíguos e atribui cada intervalo (bloco) a um fragmento. Por exemplo, usuários com userId de 1 a 10.000 vão para o fragmento A, de 10.001 a 20.000 para o fragmento B, e assim por diante. Documentos com valores próximos da chave de fragmentação ficam no mesmo fragmento, o que é ideal para consultas por intervalo.

// Enable ranged sharding on a field
sh.shardCollection('mydb.products', { category: 1, price: 1 })

// Range query is now targeted to the shard(s) holding that range
db.products.find({ category: 'electronics', price: { $lt: 100 } })

Fragmentação por intervalo: vantagens

A fragmentação por intervalo é excelente quando sua aplicação consulta com frequência intervalos de valores: intervalos de datas, intervalos de preços, intervalos alfabéticos de nomes ou resultados paginados ordenados por um ID numérico. Como os valores adjacentes ficam no mesmo fragmento, as consultas por intervalo tornam-se consultas direcionadas que acessam apenas um ou poucos fragmentos, mantendo a latência baixa.

// With ranged sharding on { orderId: 1 }, this is targeted:
db.orders.find({
  orderId: { $gte: 50000, $lte: 60000 }
})
// mongos knows exactly which shard owns this range

Fragmentação por intervalo: desvantagem — pontos de sobrecarga

A principal desvantagem da fragmentação por intervalo são os pontos de sobrecarga de gravação quando a chave de fragmentação cresce monotonicamente (carimbos de data e hora, IDs de incremento automático, ObjectId). Todos os novos documentos se concentram na extremidade superior do intervalo e chegam a um único fragmento. Até que o balanceador migre os blocos, esse fragmento absorve todo o tráfego de gravação enquanto os outros ficam ociosos.

// Problematic: all new events go to the max-range shard
sh.shardCollection('mydb.events', { createdAt: 1 }) // ranged, monotonic = hot spot

// Production symptom: one shard has 90%+ of recent data
// and absorbs all write IOPS

Fragmentação por hash: como funciona

Na fragmentação por hash, o MongoDB calcula um hash do valor da chave de fragmentação e usa esse hash para determinar o bloco. Os documentos são distribuídos com base nos valores de hash, que parecem aleatórios mesmo quando as chaves originais aumentam monotonicamente. Isso garante uma distribuição inicial de gravações quase uniforme entre todos os fragmentos.

// Hashed sharding on _id (neutralizes ObjectId monotonicity)
sh.shardCollection('mydb.events', { _id: 'hashed' })

// Hashed sharding on userId
sh.shardCollection('mydb.sessions', { userId: 'hashed' })

Pontos fortes da fragmentação por hash

A fragmentação por hash é a melhor escolha quando seu principal objetivo é obter uma distribuição uniforme de gravações entre os fragmentos e você não precisa fazer consultas por intervalo na chave de fragmentação. Ela é ideal para cargas de trabalho com alta taxa de inserções e chaves monotônicas, como registros de eventos, dados de sensores de IoT e mensagens, nas quais cada fragmento deve absorver uma parcela igual do tráfego de gravação.

// With hashed sharding, inserts are spread uniformly:
// doc1 (hash: 2345...) -> shard A
// doc2 (hash: 8901...) -> shard C
// doc3 (hash: 4567...) -> shard B
// No hot spot regardless of insert order

Limitação da fragmentação por hash: nenhuma eficiência em intervalos

A desvantagem da fragmentação por hash é que as consultas por intervalo na chave de fragmentação se tornam operações de dispersão e agregação. Como valores de hash adjacentes ficam espalhados entre os fragmentos, uma consulta como { createdAt: { $gte: t1, $lte: t2 } } precisa ser enviada a todos os fragmentos. Se as consultas por intervalo forem frequentes e sensíveis à latência, a fragmentação por hash poderá anular os ganhos de desempenho obtidos com a fragmentação.

// With hashed sharding on createdAt:
// Range query CANNOT be targeted — fans out to all shards
db.events.find({ createdAt: { $gte: ISODate('2025-01-01'), $lte: ISODate('2025-02-01') } })
// Equivalent to a full collection scan across all shards

Escolhendo entre fragmentação por intervalo e por hash

Guia de decisão: fragmentação por intervalo → sua chave de fragmentação tem uma distribuição natural (não monotônica) AND suas principais consultas são consultas por intervalo nessa chave. Fragmentação por hash → sua chave de fragmentação é monotônica OR suas principais consultas são buscas pontuais (por igualdade) em um campo de alta cardinalidade. Em caso de dúvida, quando as inserções forem o gargalo, prefira a fragmentação por hash.

Híbrida: chave composta com componente por hash

Você pode combinar as duas estratégias com uma chave de fragmentação composta, na qual o primeiro campo usa intervalos e proporciona afinidade às consultas, enquanto um segundo campo com hash distribui a carga dentro de cada intervalo. Exemplo: { tenantId: 1, _id: 'hashed' } mantém os dados agrupados por locatário para consultas direcionadas, ao mesmo tempo que distribui as gravações entre os fragmentos dentro de cada locatário.

// Ranged tenantId + hashed _id within tenant
// Writes are distributed; per-tenant queries are targeted
sh.shardCollection('mydb.events', { tenantId: 1, _id: 'hashed' })

// Targeted: all tenantId queries go to the right shard(s)
db.events.find({ tenantId: 'acme', _id: ObjectId('...') })

Verificando qual estratégia está ativa

Você pode inspecionar a configuração de fragmentação de uma coleção para determinar qual estratégia está em uso. Os metadados do servidor de configuração armazenam a chave de fragmentação e informam se ela usa 'hashed'. O comando sh.status() e db.collection.stats() expõem essas informações.

// Check sharding info for a collection
use config
db.collections.findOne({ _id: 'mydb.events' })
// { key: { _id: 'hashed' }, unique: false, ... }

// Or via sh.status()
sh.status()

Pré-dividindo blocos para carregamentos em massa

Ao carregar dados em massa em uma coleção recém-fragmentada, todos os blocos ficam inicialmente em um único fragmento e precisam ser migrados pelo balanceador, o que pode ser lento. A pré-divisão cria um conjunto inicial de blocos vazios distribuídos entre todos os fragmentos antes do carregamento. Isso garante que o trabalho do balanceador seja minimizado e que as gravações sejam distribuídas desde a primeira inserção.

// Pre-split chunks for ranged sharding
// Define desired split points and assign to shards
db.adminCommand({ split: 'mydb.events', middle: { userId: 500000 } })
db.adminCommand({ moveChunk: 'mydb.events',
  find: { userId: 500000 }, to: 'shard02' })

Verificação rápida

Teste sua compreensão dos conceitos de MongoDB e bancos de dados NoSQL apresentados nesta lição.

Recapitulação da lição

Nesta lição, você aprendeu que: a fragmentação por intervalo mantém valores de chave semelhantes no mesmo local para permitir consultas por intervalo eficientes, mas cria pontos de concentração com chaves monotônicas; a fragmentação por hash distribui os dados uniformemente entre os fragmentos, mas transforma as consultas por intervalo em operações de dispersão e agregação; e as chaves compostas podem combinar os dois benefícios. A seguir, exploraremos a fragmentação por zonas para fixar dados em regiões específicas.

Grátis para começar

Aprenda JavaScript com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
30
Aulas
120

Perguntas Frequentes

A aula “Estratégias de fragmentação por intervalo e por hash” é grátis?

Sim — o texto completo de “Estratégias de fragmentação por intervalo e por hash” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de MongoDB Academy, atualize para CoddyKit PRO. O curso de MongoDB Academy inclui 4 aulas no total.

O que vou aprender em “Estratégias de fragmentação por intervalo e por hash”?

Você configurará uma coleção com fragmentação por intervalo para consultas por intervalo ou por hash para distribuição uniforme das gravações e comparará suas vantagens e desvantagens. Você pratica MongoDB Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar MongoDB Academy?

Nenhuma experiência prévia é necessária. MongoDB Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Estratégias de fragmentação por intervalo e por hash”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de MongoDB Academy?

Sim. Cada aula de MongoDB Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Conceitos de fragmentação: blocos, balanceador e chaves de fragmentação
  2. Escolhendo uma chave de fragmentação: cardinalidade, frequência e monotonicidade
  3. Estratégias de fragmentação por intervalo e por hash
  4. Fragmentação por zonas: fixando dados em regiões
← Voltar para MongoDB Academy