Índices desnecessários
Lauren Schaefer, Daniel Coupal4 min read • Published Feb 12, 2022 • Updated Oct 01, 2024
Avalie esse Artigo
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ê.
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:
- Í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.
- 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.
- 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:
- O índice raramente é usado ou nunca é usado.
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.1 // InspirationalWomen collection 2 3 { 4 "_id": { 5 "$oid": "5ec81cc5b3443e0e72314946" 6 }, 7 "first_name": "Sally", 8 "last_name": "Ride", 9 "birthday": 1951-05-26T00:00:00.000Z, 10 "occupation": "Astronaut", 11 "quote": "I would like to be remembered as someone who was not afraid to do what 12 she wanted to do, and as someone who took risks along the way in order 13 to achieve her goals.", 14 "hobbies": [ 15 "Tennis", 16 "Writing children's books" 17 ] 18 }
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.
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:
{ first_name: 1 }
{ last_name: 1 }
{ birthday: 1 }
{ occupation: 1 }
{ quote: 1 }
{ hobbies: 1 }
{ 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.
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.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 índices
last_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
.leslie decide descartar todos os índices desnecessários. Após fazer isso, sua coleção agora tem os seguintes índices:
_id
é indexado por padrão.{ hobbies: 1 }
{ last_name: 1, first_name: 1}
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:
{Parte de uma série