Os índices suportam a execução eficiente de consultas no MongoDB. Sem índices, o MongoDB deve digitalizar todos os documentos em uma coleção para retornar resultados da consulta.
O que são Índices no MongoDB?
Estruturas de Dados: Índices no MongoDB são estruturas de dados que melhoram a velocidade de consulta ao permitir o acesso eficiente aos documentos em uma coleção.
Baseados em Campos: Podem ser criados em um ou vários campos de um documento, permitindo a otimização de consultas específicas.
Se existir um índice apropriado para uma consulta, o MongoDB usa o índice para limitar o número de documentos que deve digitalizar.
Mas nada como exemplo prático, certo? Vamos conhecer mais dos índices e testá-los?
Índice de campo único: Índices de campo único armazenam informações de um único campo em uma coleção. Por padrão, todas as coleções possuem um índice no _id campo. Você pode adicionar índices adicionais para acelerar consultas e operações importantes.
Vamos trabalhar com um banco de sample_mflix, que comporta dados de filmes, abaixo, um exemplo de modelo do nosso documento da coleção movies.
E agora queremos fazer uma busca de filmes que obtiveram mais de 3 vitórias em indicações a prêmios.
Considerando o nosso modelo sem índice, percebemos:
Nº de documentos examinados: 25.314;
Documentos retornados: 7060,
Tempo de execução: 36ms.
E agora, com índice criado:
Em 28ms, todos os 7060 documentos foram encontrados.
Índice composto:
No caso anterior, em que buscamos em uma query simples somente filmes cujo venceram mais de três indicações aos prêmios, pode ser complementado pelo diretor do filme. Assim, não seria mais interessante termos um índice composto por directors e awards.win?
Sem sombra de dúvidas, teria mais eficiência na busca. Mas vamos agora a um ponto importante no momento da criação de um índice composto: A ordem dos campos em um índice composto pode afetar o desempenho das consultas, especialmente em consultas que buscam por uma combinação específica de campos.
Vamos ver essas diferenças aplicadas ao nosso caso?
Sem índice composto:
52ms de query.
Mais de 25 mil documentos examinados, e
18 documentos retornados.
Com índice desordenado:
db.movies.createIndex({ "awards.wins": 1, "directors": 1 })
index keys examined: 162
documents examined: 18
documents returned: 18
Apesar de ter usado os índices percebemos o seguinte, conforme a ordenação do índice, primeiro foi buscado todos os diretores (total de 162 diretores) cujo receberam mais de três prêmios em suas indicações, após esse filtro, foi buscado filmes que foram dirigidos somente por Woody Allen.
Índice composto correto:
db.movies.createIndex({ "directors": 1, "awards.wins": 1 })
Assim:
index keys examined: 18
documents examined: 18
documents returned: 18
Com o índice {"directors": 1, "awards.wins": 1}, o MongoDB começa a busca por "directors" e depois por "awards.wins". Assim, essa ordem demonstra ser mais eficiente para a consulta específica que você está executando. O número menor de index keys examined indica que o MongoDB precisou analisar menos chaves no índice para encontrar os documentos correspondentes.
Índice multichave:
db.movies.createIndex({ "genres": 1 })
Para a nossa coleção exemplo, vamos criar um índice multichave que abrange múltiplos campos que são arrays, como “genres” e “cast”.
Abaixo, sem índice criado.
Documents Examined: 25314,
Documents Returned: 3703.
Com índice criado:
Índice de texto: Vamos imaginar que utilizamos os plots dos filmes para fazer recomendações com base nos interesses dos usuários. De que forma poderíamos buscar palavras chaves nesses plots para recomendar filmes, sem o uso de índice:
db.movies.find({ "plot": { $regex: "prostitution", $options: "i" } })
Primeiro detalhe é o uso do $regex, conhecido por expressões regulares, que nos ajuda a definir uma forma de identificar padrões em cadeias de caracteres (strings). O uso do “$options: i” diz respeito a insensibilidade para palavras maiúscula ou minúsculas.
Abaixo, sem uso de índice:
Com o índice criado:
db.movies.createIndex({plot: 1})
Nesse momento, apesar do índice acima ser criado, ele se caracteriza por ser índice de campo único, ele é útil para consultas que envolvem um campo específico, como por exemplo “love”. O correto, para criar índice textual é:
db.movies.createIndex({ "plot": "text" })
Índice Geoespacial: Os índices 2dsphere suportam consultas geoespaciais em uma esfera semelhante à Terra. Para por exemplo, os índices 2dsphere podem
Determinar pontos dentro de uma área especificada.
Calcule a proximidade de um ponto especificado.
Retorna correspondências exatas em consultas de coordenadas.
Abaixo, exemplos de casos de uso:
Use índices 2dsphere para consultar e realizar cálculos em dados de localização onde os pontos de dados aparecem na Terra ou em outra superfície esférica. Para exemplo:
Um aplicativo de entrega de comida usa índices 2dsphere para dar suporte procura restaurantes próximos.
Um aplicativo de planejamento de rotas usa índices 2dsphere para calcular a distância mais curta entre as paradas para descanso.
Um planejador urbano usa índices 2dsphere para encontrar parques que existem dentro de limites da cidade.
Os índices de hash e clusterizados têm suas próprias aplicações e contextos específicos no MongoDB.
Índice de hash: São úteis para distribuir os dados de forma uniforme entre os nós do cluster. Podendo ser aplicados em situações que a distribuição uniforme dos dados é mais importante do que a ordenação, ou acesso sequencial. Não são apropriados para consultas que envolvem ordenação ou faixa de valores, já que não mantém ordem dos valores armazenados.
Índice clusterizado: São úteis em situações em que os dados são frequentemente acessados em ordem específica ou quando consultas sequenciais são comuns. Eles organizam fisicamente os documentos de acordo com o campo específico.
E então? O que você achou desse artigo, consegui te ajudar? Espero que sim. Em casos de dúvidas, não exite em perguntar/comentar, ficarei feliz em ajudar!