MongoDB: índices e explain para consultas previsíveis

Ilustração técnica sobre MongoDB: índices e explain para consultas previsíveis
Ilustração sobre MongoDB: índices e explain para consultas previsíveis

Resposta Rápida / TL;DR

Reproduza a consulta real com dados representativos, rode `explain('executionStats')`, compare documentos e chaves examinados e só então crie ou ajuste um índice.
Índice do artigo

    Resposta rápida

    Um índice deve refletir a consulta que o sistema realmente executa. Rode a consulta em dados representativos com explain("executionStats"), observe nReturned, totalDocsExamined e totalKeysExamined, crie um candidato e compare. Não escolha índice apenas porque um campo parece importante.

    Comece pelo padrão de acesso

    Liste filtros, ordenações e limites. Uma consulta que filtra tenant_id e ordena por created_at pode precisar de uma chave composta nessa ordem, mas a decisão depende de cardinalidade e de outros padrões. Índices extras ocupam memória e aumentam custo de escrita.

    Meça o plano atual

    db.orders.find({tenant_id: "t1", status: "open"})
      .sort({created_at: -1})
      .limit(20)
      .explain("executionStats")
    

    Use dados fictícios em homologação. Compare quantidade retornada e examinada, estágio do plano e tempo. Um plano em coleção pequena pode esconder o problema que aparece quando o volume cresce.

    Teste um índice candidato

    db.orders.createIndex({tenant_id: 1, status: 1, created_at: -1})
    

    Repita o explain e compare. O índice não é automaticamente melhor para todas as consultas. Examine também os padrões de escrita e a memória disponível.

    Evite conclusões falsas

    Um resultado rápido pode vir do cache; uma consulta lenta pode estar concorrendo com carga de produção. COLLSCAN nem sempre é erro em coleção minúscula, e IXSCAN não garante que o índice seja seletivo. Faça testes com volume, distribuição e filtro próximos do real.

    Operação segura

    Crie índices em janela controlada e observe impacto. Em réplicas e versões específicas, valide o procedimento de construção. Remova índice sem uso somente após período de observação e revisão das consultas. Nunca elimine um índice da produção por uma única amostra.

    Mantenha a decisão vinculada a uma consulta identificada e a uma janela de observação.

    Isso facilita revisar a alteração quando o esquema ou o padrão de tráfego mudar.

    Também registre o responsável.

    Para manter banco e aplicação com margem, conheça os planos de VPS e monitore I/O, memória e espaço.

    Checklist

    • [ ] Padrão de acesso documentado.
    • [ ] Dados representativos usados.
    • [ ] Explain antes e depois registrado.
    • [ ] Custo de escrita e memória avaliado.
    • [ ] Remoção baseada em período de observação.

    FAQ

    Mais índices sempre melhoram a leitura?

    Não. Eles podem aumentar custo de escrita, uso de memória e complexidade.

    Posso confiar só no executionTimeMillis?

    Não. Observe plano, documentos/chaves examinados, cache, concorrência e distribuição.

    Custo que fica escondido

    Todo índice precisa ser mantido durante inserções e atualizações. Em uma coleção com alta escrita, adicionar um índice para uma consulta rara pode piorar o sistema geral. Avalie tamanho, seletividade e frequência do padrão. Se a consulta inclui vários tenants, confirme que o índice não permite que uma empresa atravesse o escopo de outra; performance e isolamento de dados devem ser revisados juntos.

    Download Gratuito Template Pronto para n8n & Evolution API

    📦 Template n8n: Agente de IA com WhatsApp + Evolution API

    Baixe o arquivo JSON pronto para importar: Webhook configurado, tratamento de remetente, nó de OpenAI e disparo via Evolution API.

    Comentários (9)

    Lucas Rodrigues - Infra Cloud

    Excelente artigo sobre indexação e explain analyze. Descobrimos um sequential scan que estava travando o banco nos horários de pico.

    Leonardo Santos

    As regras de connection pooling com PgBouncer reduziram drasticamente a sobrecarga de conexões no servidor.

    João Carvalho

    Depois de ajustar o shared_buffers e o work_mem no PostgreSQL como recomendado, nossas queries analíticas rodaram 3x mais rápido.

    Fernanda Almeida

    Muito bom o comparativo entre bancos relacionais e vetoriais para aplicações de busca semântica. Ajudou muito na escolha da arquitetura.

    Daniel Rocha - SRE Squad

    Implementei o backup contínuo com pg_dump e criptografia para bucket S3. Dormindo muito mais tranquilo agora!

    Camila Rodrigues

    Artigo muito bem escrito e explicativo! Já compartilhei com toda a equipe da empresa.

    Ana Santos

    Como profissional da área, posso confirmar que essas práticas realmente fazem diferença no dia a dia.

    Fernando Rodrigues - E-commerce Brasil

    Excelente conteúdo! Aprendi conceitos que não encontrava em outros lugares em português.

    Pedro Oliveira

    Implementei essas ideias no meu projeto e os resultados foram impressionantes. Obrigado pelo conhecimento compartilhado! Será que isso funciona também com [tecnologia relacionada]?

    ← Voltar para o blog