EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
MongoDBchevron-right

Índices desnecessários

Lauren Schaefer, Daniel Coupal4 min read • Published Feb 12, 2022 • Updated May 31, 2022
MongoDBEsquema
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Até agora nesta série Anti-Padrões de Design de Esquema do MongoDB, conversamos sobre como evitar arrays massivas, bem como um grande número de collections.
Hoje, vamos falar sobre índices. Os índices são ótimos (sério!), mas é fácil se deixar levar e criar índices que você nunca usará. Vamos examinar por que um índice pode ser desnecessário e quais são as consequências de mantê-lo por perto.
Você prefere assistir do que ler? O vídeo acima é só para você.

Índices desnecessários

Antes de prosseguirmos, queremos enfatizar que osíndices são bons. Índices permitem que o MongoDB consulte dados com eficiência. Se uma query não tiver um índice para dar suporte a ela, o MongoDB realizará uma varredura de collection, o que significa que ela verifica todos os documentos de uma collection. Os escaneamentos de collections podem ser muito lentos. Se você executa uma query com frequência, verifique se tem um índice para apoiá-la.
Agora que entendemos que os índices são bons, você pode estar se perguntando: "Por que índices desnecessários são um antipadrão? Por que não criar um índice em cada campo para o caso de eu precisar dele no futuro?"
Descobrimos três grandes motivos pelos quais você deve remover índices desnecessários:
  1. Índices ocupam espaço. Cada índice tem pelo menos 8 kB e cresce com o número de documentos associados a ele. Milhares de índices podem começar a drenar recursos.
  2. Os índices podem afetar o desempenho do storage engine. Como mencionamosna publicação anterior desta série sobre o Massive Number of Collections Anti-Pattern, o WiredTiger storage engine (o storage engine padrão do MongoDB) armazena um arquivo para cada collection e para cada índice. O WiredTiger abrirá todos os arquivos na inicialização, portanto, o desempenho diminuirá quando houver um número excessivo de collections e índices.
  3. Os índices podem afetar o desempenho de gravação. Sempre que um documento é criado, atualizado ou excluído, qualquer índice associado a esse documento também deve ser atualizado. Essas atualizações do índice afetam negativamente o desempenho de gravação.
Em geral, recomendamos limitar sua coleção a um máximo de índices 50.
Para evitar o antipadrão de índices desnecessários, examine seu banco de dados e identifique quais índices são realmente necessários. Índices desnecessários normalmente se enquadram em uma das duas categorias:
  1. O índice raramente é usado ou nunca é usado.
  2. O índice é redundante porque outro índice composto o cobre.

Exemplo

Considere leslie do Incrível programa de Tv Parques e Recreio. leslie muitas vezes procura outras poderosas em busca de expiração.
Digamos que Leslie queira inspirar outras pessoas, então ela cria um site sobre suas mulheres inspiradoras favoritas. O site permite que os usuários pesquisem por nome completo, sobrenome ou passatempo.
leslie escolhe utilizar MongoDB Atlas para criar seu banco de dados. Ela cria uma collection denominada InspirationalWomen. Dentro dessa collection, ela cria um documento para cada mãe e modelo. Abaixo está um documento que ela criou para SallyRide.
Leslie come várias barras de Nutriyum cheias de açúcar e, aproveitando o açúcar, cria um índice para cada campo de sua coleção.
leslie diz: " Há um componente secreto nessas barras de Nutryum que me fazem sentir tão bem."
Ela também cria um índice composto nos campos last_name e first_name, para que os usuários possam pesquisar por nome completo. Leslie agora tem uma coleção com oito índices:
  1. _id é indexado por padrão (consulte os MongoDB Docs para obter mais detalhes)
  2. { first_name: 1 }
  3. { last_name: 1 }
  4. { birthday: 1 }
  5. { occupation: 1 }
  6. { quote: 1 }
  7. { hobbies: 1 }
  8. { last_name: 1, first_name: 1}
Leslie lança seu site e está animada para ajudar outras pessoas a encontrar inspiração. Os usuários estão descobrindo novos modelos à medida que pesquisam por nome completo, sobrenome e hobby.

Remover índices desnecessários

leslie decide ajustar seu banco de dados e se pergunta se todos os índices que ela criou são realmente necessários.
Ela abre o Atlas Data Explorer e navega até o painel Índices. Ela pode ver que os únicos dois índices que estão sendo usados são o índice composto chamado last_name_1_first_name_1 e o índicehobbies_1. Ela entende que isso faz sentido.
Suas consultas para mulheres inspiradoras por nome completo são cobertas pelo last_name_1_first_name_1 índice . Além disso, sua consulta de mulheres inspiradoras pelo sobrenome é coberta pelo mesmo last_name_1_first_name_1 índice composto , pois o índice tem um last_name prefixo. Suas consultas de mulheres inspiradoras por hobby são cobertas pelo hobbies_1 índice . Como essas são as únicas maneiras pelas quais os usuários podem consultar seus dados, os outros índices são desnecessários.
O Atlas Data Explorer exibe o uso do índice e permite aos usuários excluir índices.
O Atlas Data Explorer exibe o uso do índice e permite aos usuários excluir índices.
No Data Explorer, Leslie tem a opção de eliminar todos os outros índices desnecessários. Como o MongoDB exige um índice no campo_id, ela não pode eliminar esse índice.
Além de usar o Data Explorer, Leslie também tem a opção de usar o MongoDB Compass para verificar índices desnecessários. Quando ela navega até o painel Índices de sua collection, ela pode ver mais uma vez que os índiceslast_name_1_first_name_1 e hobbies_1 são os únicos índices que estão sendo usados regularmente. Assim como faria no Atlas Data Explorer, Leslie tem a opção de descartar cada um dos índices, exceto _id.
O Compass exibe o uso do índice e permite que os usuários excluam índices.
O Compass exibe o uso do índice e permite que os usuários excluam índices.
leslie decide descartar todos os índices desnecessários. Após fazer isso, sua coleção agora tem os seguintes índices:
  1. _id é indexado por padrão.
  2. { hobbies: 1 }
  3. { last_name: 1, first_name: 1}

Resumo

Criar índices que suportam suas consultas é bom. Criar índices desnecessários geralmente é ruim.
Índices desnecessários reduzem o desempenho e ocupam espaço. Um índice é considerado desnecessário se (1) não for usado com frequência por uma consulta ou (2) for redundante porque outro índice composto o cobre.
Você pode usar o Atlas Data Explorer ou o MongoDB Compass para ajudá-lo a descobrir com que frequência seus índices estão sendo usados. Quando você descobrir que um índice é desnecessário, remova-o.
Fique atento à próxima postagem desta série sobre antipadrões!
Confira os seguintes recursos para obter mais informações:

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
{Parte de uma série
Antipadrões de projeto de esquema do MongoDB
Próximo
Continuar

Mais nesta série
Relacionado
Tutorial

Como usar a fase do pipeline de agregação Union All no MongoDB 4.4


Sep 09, 2024 | 16 min read
Tutorial

Preparing Time Series Data for Analysis Tools With $densify and $fill


Sep 17, 2024 | 8 min read
Tutorial

Integrating MongoDB With Amazon Managed Streaming for Apache Kafka (MSK)


Sep 17, 2024 | 7 min read
Tutorial

Um guia para novatos sobre como integrar o MongoDB com o TensorFlow usando JavaScript


Sep 04, 2024 | 15 min read
Sumário
  • Índices desnecessários