Interseção de índices versus índices compostos
Você entenderá quando o MongoDB cruza vários índices de campo único e quando um índice composto supera essa interseção.
Interseção de índices versus índices compostos é 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.
O que é interseção de índices?
Interseção de índices é a capacidade do MongoDB de usar simultaneamente dois ou mais índices de campo único para atender a uma única consulta. Em vez de criar um índice composto que cubra todos os campos do filtro, o MongoDB examina vários índices de forma independente e depois obtém a interseção dos IDs dos documentos correspondentes. Parece conveniente, mas, na prática, raramente é tão rápido quanto um índice composto bem projetado.
Como a interseção de índices funciona internamente
Quando o MongoDB considera a interseção de índices, o planejador de consultas: 1) Examina o índice A em busca de documentos que correspondam à condição 1 e coleta seus IDs de registro. 2) Examina o índice B em busca de documentos que correspondam à condição 2. 3) Calcula a interseção dos dois conjuntos de IDs. 4) Busca os documentos reais usando esses IDs. Isso é chamado de etapa AND_SORTED ou AND_HASH na saída de explain().
// With two single-field indexes:
db.orders.createIndex({ status: 1 })
db.orders.createIndex({ customerId: 1 })
// Query may intersect both indexes
db.orders.find({ status: 'pending', customerId: 'c001' })
.explain('executionStats')
// Look for 'AND_SORTED' or 'AND_HASH' stage in winningPlanQuando o MongoDB escolhe a interseção
O MongoDB usa a interseção de índices somente quando o planejador de consultas calcula que ela é mais barata que as alternativas. O planejador executa em paralelo até 200 planos candidatos (usando execução de teste) e escolhe aquele com o menor custo estimado. A interseção tem mais probabilidade de ser escolhida quando a coleção é grande e cada índice individual é altamente seletivo — ambos restringem drasticamente o conjunto de candidatos antes da etapa de interseção.
// Check if MongoDB chose to intersect indexes
const plan = db.orders.find({
status: 'pending',
customerId: 'c001'
}).explain('executionStats')
// Intersection chosen:
print(JSON.stringify(plan.queryPlanner.winningPlan, null, 2))
// Look for: 'stage': 'AND_SORTED'Índice composto versus interseção: a diferença principal
Um índice composto armazena chaves de vários campos em uma única árvore B previamente ordenada. Uma consulta nesses campos faz uma única varredura eficiente do índice e retorna os documentos em ordem. A interseção de índices faz várias varreduras separadas e depois mescla os resultados na memória. A etapa de mesclagem adiciona sobrecarga de CPU e memória que um índice composto evita completamente.
// Compound index: one scan, sorted output
db.orders.createIndex({ status: 1, customerId: 1 })
// Single scan: fast, no in-memory merge
db.orders.find({ status: 'pending', customerId: 'c001' })
// explain(): IXSCAN stage only — no AND_SORTEDÍndices compostos são melhores para ordenação
A interseção de índices não pode atender a uma ordenação — o conjunto de resultados mesclado não está em uma ordem específica em relação à chave de ordenação, portanto o MongoDB precisa executar uma etapa SORT em memória. Um índice composto que inclua o campo de ordenação entrega os resultados diretamente na ordem correta, evitando completamente a sobrecarga da ordenação. Para consultas que filtram e ordenam, um índice composto quase sempre é superior.
// Index intersection + sort = in-memory sort required
db.orders.find({ status: 'pending', customerId: 'c001' })
.sort({ createdAt: 1 })
// Even if both status and customerId indexes intersect,
// MongoDB must still sort the merged result in memory
// Compound index avoids the sort stage
db.orders.createIndex({ status: 1, customerId: 1, createdAt: 1 })Quando a interseção pode superar o índice composto
A interseção de índices ocasionalmente supera um índice composto quando: 1) Ambos os índices individuais são altamente seletivos (cada um retorna pouquíssimos documentos). 2) A consulta é ad hoc — não é possível prever quais campos serão filtrados em conjunto, portanto criar um índice composto para cada combinação seria impraticável. 3) A coleção recebe muitas escritas — menos índices significam menor sobrecarga de escrita, então usar a interseção de dois índices existentes evita adicionar um terceiro.
Controlando o planejador de consultas com hint()
Você pode forçar o MongoDB a usar um índice específico (ou uma estratégia de interseção) com .hint(). Isso ignora a seleção automática do planejador e é útil para comparações de desempenho — você pode comparar as estatísticas de execução do índice composto escolhido manualmente com o que o planejador faria usando índices individuais.
// Force a specific compound index
db.orders.find({ status: 'pending', customerId: 'c001' })
.hint({ status: 1, customerId: 1 })
.explain('executionStats')
// Force use of a single-field index (no intersection)
db.orders.find({ status: 'pending', customerId: 'c001' })
.hint({ status: 1 })
.explain('executionStats')Detectando a interseção na saída de explain()
Quando o MongoDB usa a interseção de índices, a saída de explain() mostra uma etapa AND_SORTED ou AND_HASH como predecessora de duas etapas IXSCAN. AND_SORTED é usada quando ambos os índices retornam resultados na mesma ordem; AND_HASH cria na memória uma tabela de dispersão de um conjunto de resultados e consulta essa tabela com o outro. Ambos são sinais de que um índice composto bem escolhido poderia ser mais rápido.
// Identify intersection usage
const plan = db.orders
.find({ status: 'pending', region: 'EU' })
.explain('executionStats')
// Check for AND_SORTED or AND_HASH
// If found, benchmark against a compound index { status:1, region:1 }A regra geral: prefira índices compostos
Para padrões de consulta conhecidos e repetidos, um índice composto quase sempre é mais rápido do que depender da interseção. Os únicos motivos para preferir a interseção são: as consultas são imprevisíveis demais para serem cobertas por índices compostos ou o volume de escrita é tão alto que adicionar mais índices seria muito dispendioso. Nesses casos, mantenha os índices individuais enxutos e permita que o planejador faça a interseção quando isso ajudar.
Auditoria de índices: removendo índices redundantes
À medida que as aplicações evoluem, os desenvolvedores adicionam índices de forma reativa. Com o tempo, as coleções acumulam índices redundantes que tornam as escritas mais lentas sem beneficiar as leituras. Faça revisões regulares usando $indexStats: qualquer índice com zero accesses.ops durante um longo período não é usado e pode ser removido. Procure também índices que se tornaram redundantes devido à regra do prefixo de índices compostos.
// Identify unused indexes
db.orders.aggregate([{ $indexStats: {} }])
// { name: 'status_1', accesses: { ops: 0, since: ... } }
// If ops is 0 since a long time, the index is unused — drop it
db.orders.dropIndex('status_1')Orientação prática: uma estrutura de decisão
Use esta estrutura: O padrão de consulta é conhecido e repetido? → Crie um índice composto usando ESR. A consulta é ad hoc ou difícil de prever? → Dependa de índices individuais e aceite a possibilidade de interseção. O volume de escrita é crítico? → Minimize o número total de índices; remova os índices não utilizados. A consulta envolve uma ordenação? → Use sempre um índice composto; a interseção nunca atende a ordenações.
Verificação rápida
Teste sua compreensão dos conceitos de MongoDB e bancos de dados NoSQL apresentados nesta lição.
Resumo da lição
Nesta lição, aprendeu que: a interseção de índices usa dois índices de campo único e mescla os resultados na memória, adicionando sobrecarga, os índices compostos quase sempre são mais rápidos para padrões de consulta conhecidos e repetidos — especialmente os que incluem ordenações e deve usar $indexStats para encontrar e remover índices não utilizados ou redundantes que tornam as gravações mais lentas. A seguir, exploraremos dicas para otimizar pipelines de agregação.
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 “Interseção de índices versus índices compostos” é grátis?
Sim — o texto completo de “Interseção de índices versus índices compostos” é 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 “Interseção de índices versus índices compostos”?
Você entenderá quando o MongoDB cruza vários índices de campo único e quando um índice composto supera essa interseção. 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 “Interseção de índices versus índices compostos”?
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
- O perfilador do banco de dados e o registro de consultas lentas
- Regra do prefixo de índices compostos e princípio ESR
- Interseção de índices versus índices compostos
- Dicas para otimizar pipelines de agregação