MongoDB Academy · Aula

Escolhendo uma chave de fragmentação: cardinalidade, frequência e monotonicidade

Você avaliará candidatas a chaves de fragmentação segundo três dimensões — cardinalidade, distribuição das gravações e direcionamento das consultas — e evitará padrões problemáticos de fragmentos sobrecarregados.

Aula 2 de 413 etapas

Escolhendo uma chave de fragmentação: cardinalidade, frequência e monotonicidade é uma aula grátis de MongoDB Academy no CoddyKit. Esta é a aula 2 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.

Por que a escolha da chave de fragmentação é fundamental

A chave de fragmentação é imutável depois de definida e não pode ser alterada sem desfazer a fragmentação e fragmentar novamente toda a coleção — uma operação cara e perturbadora. Escolher a chave de fragmentação errada causa fragmentos sobrecarregados, roteamento inadequado de consultas e desperdício de hardware. Você deve avaliar as candidatas em três dimensões: cardinalidade, frequência e monotonicidade.

Cardinalidade: quantos valores distintos?

Cardinalidade é o número de valores distintos que a chave de fragmentação pode assumir. Uma cardinalidade alta (por exemplo, userId, email, orderId) é positiva — ela oferece ao MongoDB muitos limites possíveis para os blocos e permite que o balanceador distribua os dados com precisão. Uma cardinalidade baixa (por exemplo, status: 'active' | 'inactive' ou country com 50 valores) cria blocos gigantes que não podem ser divididos nem migrados.

// HIGH cardinality — good shard key
sh.shardCollection('mydb.users', { userId: 1 })

// LOW cardinality — avoid: only 2 chunk boundaries possible
sh.shardCollection('mydb.users', { status: 1 }) // BAD

Frequência: quão uniformemente os valores são distribuídos?

Frequência mede quantos documentos compartilham cada valor da chave de fragmentação. Mesmo chaves com cardinalidade alta podem ser problemáticas se um pequeno número de valores aparecer na grande maioria dos documentos. Por exemplo, um campo countryCode pode ter 200 valores distintos, mas 90% dos usuários podem ser de um único país — criando um bloco enorme e sobrecarregado que não pode ser dividido.

// Estimate frequency distribution before choosing
db.users.aggregate([
  { $group: { _id: '$countryCode', count: { $sum: 1 } } },
  { $sort: { count: -1 } },
  { $limit: 10 }
])
// If top 1 value has 80%+ of docs, this is a bad shard key

Monotonicidade: os valores estão sempre aumentando?

Monotonicidade indica se os valores da chave de fragmentação sempre aumentam (ou diminuem) ao longo do tempo. Campos como os carimbos de data e hora de createdAt e ObjectId (_id) são monotonicamente crescentes. Isso é problemático porque todas as novas inserções chegam ao mesmo bloco de valor máximo em um fragmento, criando um ponto de sobrecarga de gravação mesmo quando os dados estão historicamente distribuídos de maneira uniforme.

// Monotonic keys cause write hot spots
// All new orders go to the shard with the latest date range
sh.shardCollection('mydb.orders', { createdAt: 1 }) // BAD for high insert rate

// Fix: use hashed sharding to spread monotonic keys
sh.shardCollection('mydb.orders', { createdAt: 'hashed' })

Resumo das propriedades ideais da chave de fragmentação

A chave de fragmentação ideal tem: alta cardinalidade — milhares ou milhões de valores distintos. baixa concentração de frequência — nenhum valor individual predomina. distribuição não monotônica — os valores não aumentam sempre, ou você usa fragmentação por hash. alinhamento com as consultas — corresponde aos filtros das consultas mais frequentes e sensíveis à latência para permitir o roteamento direcionado.

Chaves de fragmentação compostas

Uma chave de fragmentação composta combina dois campos para obter uma distribuição melhor. Por exemplo, { tenantId: 1, createdAt: 1 } distribui os dados entre os locatários (alta cardinalidade) e permite consultas por intervalo dentro de cada locatário. O primeiro campo determina a distribuição geral; o segundo permite uma divisão mais detalhada. Chaves compostas podem atender a predicados de consultas com vários campos como consultas direcionadas.

// Compound shard key: tenant + date
sh.shardCollection('mydb.events', { tenantId: 1, createdAt: 1 })

// This query is fully targeted (both shard key fields present)
db.events.find({ tenantId: 't123', createdAt: { $gte: ISODate('2025-01-01') } })

Chaves de fragmentação por hash

Uma chave de fragmentação por hash aplica uma função de hash ao valor do campo antes de mapeá-lo para um bloco. Isso converte chaves monotônicas (como ObjectId) em valores de hash distribuídos aleatoriamente, eliminando pontos de sobrecarga de gravação. A desvantagem é que as consultas por intervalo no campo se tornam consultas distribuídas, pois os valores de hash não são armazenados na ordem original.

// Hashed sharding: uniform write distribution
sh.shardCollection('mydb.events', { _id: 'hashed' })

// Range query on _id is now scatter-gather (con)
// But all inserts are evenly distributed (pro)

Fragmentação por zonas para distribuição geográfica

O MongoDB permite a fragmentação por zonas, na qual você atribui intervalos da chave de fragmentação a fragmentos específicos usando etiquetas (zonas). Isso é útil para requisitos de residência de dados: os dados de usuários europeus podem ser fixados em fragmentos da região EU, e os dados dos US em fragmentos dos US. A fragmentação por zonas exige uma chave de fragmentação composta, com um prefixo de região como primeiro componente.

// Tag shards with zones
sh.addShardTag('shard01', 'EU')
sh.addShardTag('shard02', 'US')

// Assign key ranges to zones
sh.addTagRange('mydb.users',
  { region: 'EU', userId: MinKey },
  { region: 'EU', userId: MaxKey },
  'EU'
)

Avaliando candidatas: uma lista prática

Ao avaliar candidatas a chave de fragmentação: 1) Execute uma verificação de cardinalidade — db.col.distinct('field').length deve resultar em milhares ou mais. 2) Verifique a distribuição de frequência com uma agregação. 3) Determine se o campo é monotônico (carimbos de data e hora, incremento automático). 4) Analise suas 5 consultas mais frequentes — o campo candidato aparece no filtro delas?

// Quick cardinality check
db.events.distinct('userId').length   // want > 10,000+

// Frequency check — any value > 1% of docs is a risk
const total = db.events.countDocuments()
db.events.aggregate([
  { $group: { _id: '$userId', n: { $sum: 1 } } },
  { $match: { n: { $gt: total * 0.01 } } }
])

O campo _id como chave de fragmentação por hash

Um padrão comum e seguro para muitas cargas de trabalho é usar { _id: 'hashed' }. Os valores de ObjectId do MongoDB, embora monotônicos, tornam-se distribuídos uniformemente depois do hashing. Isso proporciona uma distribuição uniforme das gravações desde o início. A principal limitação é que qualquer consulta por intervalo em _id se torna uma consulta distribuída — mas, para a maioria das cargas de trabalho de busca no nível do documento, isso é aceitável.

// Safe default for write-heavy workloads without range queries
sh.shardCollection('mydb.messages', { _id: 'hashed' })

// Single-document lookup by _id is still targeted
// (hash is deterministic: mongos knows which shard)
db.messages.findOne({ _id: ObjectId('...') })

Seleção da chave de fragmentação no Atlas

O MongoDB Atlas oferece um Consultor de chaves de fragmentação no Consultor de desempenho, que analisa seus padrões de consulta e recomenda chaves de fragmentação com base no uso real. Ele pode detectar chaves monotônicas, concentração de frequência e índices ausentes. Usar o consultor antes da fragmentação é especialmente útil para cargas de trabalho de produção cujos padrões de consulta já estão estabelecidos.

Verificação rápida

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

Recapitulação da lição

Nesta lição, você aprendeu que: uma boa chave de fragmentação tem alta cardinalidade, baixa concentração de frequência e evita valores monotônicos, as chaves de fragmentação compostas combinam cobertura para distribuição e direcionamento de consultas e a fragmentação por hash neutraliza pontos de sobrecarga causados por chaves monotônicas, ao custo da eficiência das consultas por intervalo. A seguir, compararemos em detalhes as estratégias de fragmentação por intervalo e por hash.

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 “Escolhendo uma chave de fragmentação: cardinalidade, frequência e monotonicidade” é grátis?

Sim — o texto completo de “Escolhendo uma chave de fragmentação: cardinalidade, frequência e monotonicidade” é 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 “Escolhendo uma chave de fragmentação: cardinalidade, frequência e monotonicidade”?

Você avaliará candidatas a chaves de fragmentação segundo três dimensões — cardinalidade, distribuição das gravações e direcionamento das consultas — e evitará padrões problemáticos de fragmentos sob… 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 2 de 4.

Quanto tempo leva a aula “Escolhendo uma chave de fragmentação: cardinalidade, frequência e monotonicidade”?

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