Criar Índices no MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá as técnicas fundamentais para criar e gerenciar índices no MongoDB. Índices são cruciais para otimizar o desempenho do banco de dados, pois permitem que o banco de dados encontre e recupere dados muito mais rapidamente do que escaneando cada documento em uma coleção. Você praticará a criação de índices de campo único, compostos e únicos, analisará seu impacto no desempenho de consultas e gerenciará seu ciclo de vida. Ao final deste laboratório, você terá uma compreensão sólida de como usar índices para tornar suas consultas MongoDB mais eficientes.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 100%. Recebeu uma taxa de avaliações positivas de 93% dos estudantes.

Criar um Índice de Campo Único

Nesta primeira etapa, você se conectará ao MongoDB, criará um banco de dados com uma coleção de exemplo e, em seguida, criará seu primeiro índice em um único campo. Um índice de campo único melhora o desempenho de consultas que filtram ou ordenam por esse campo específico.

Primeiro, abra o MongoDB Shell digitando mongosh em seu terminal. Isso o conectará ao servidor MongoDB em execução em seu ambiente.

mongosh

Assim que estiver dentro do MongoDB Shell, você verá um prompt >. Vamos criar e alternar para um novo banco de dados chamado indexlab. Todos os comandos subsequentes neste laboratório serão executados dentro deste shell, a menos que seja notado o contrário.

use indexlab

Agora, vamos inserir alguns documentos de exemplo em uma nova coleção chamada users. Esses dados serão usados ao longo do laboratório.

db.users.insertMany([
  { name: "Alice", age: 28, email: "alice@example.com" },
  { name: "Bob", age: 35, email: "bob@example.com" },
  { name: "Charlie", age: 42, email: "charlie@example.com" }
]);

Com nossos dados no lugar, vamos criar um índice no campo name. Um índice em um único campo ajuda a acelerar consultas que buscam documentos por esse campo.

db.users.createIndex({ name: 1 });

No comando acima, { name: 1 } especifica que o índice deve ser criado no campo name em ordem ascendente. Usar -1 criaria um índice descendente.

Para verificar se o índice foi criado, você pode listar todos os índices da coleção users.

db.users.getIndexes();

Você deverá ver dois índices na saída. Um é o índice padrão _id criado pelo MongoDB em cada coleção, e o outro é o índice name_1 que você acabou de criar.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" }
]

Criar um Índice Composto

Embora índices de campo único sejam úteis, muitas consultas filtram por múltiplos campos. Para esses casos, um índice composto, que inclui vários campos, pode fornecer um aumento significativo de desempenho. Nesta etapa, você criará um índice composto.

Vamos continuar no shell mongosh. Criaremos um índice composto nos campos age e name. A ordem dos campos em um índice composto é importante. O MongoDB pode usar este índice para suportar consultas apenas por age, ou por age e depois name.

db.users.createIndex({ age: -1, name: 1 });

Este comando cria um índice que primeiro ordena os documentos por age em ordem descendente (-1) e, em seguida, para documentos com a mesma idade, os ordena por name em ordem ascendente (1).

Vamos adicionar mais alguns documentos para tornar nossa coleção mais diversificada para consultas.

db.users.insertMany([
  { name: "David", age: 28, email: "david@example.com" },
  { name: "Eve", age: 35, email: "eve@example.com" }
]);

Agora, visualize a lista de índices novamente para ver seu novo índice composto.

db.users.getIndexes();

A saída agora incluirá o índice age_-1_name_1, além dos anteriores.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" },
  { "v": 2, "key": { "age": -1, "name": 1 }, "name": "age_-1_name_1" }
]

Este índice composto servirá eficientemente consultas que filtram ou ordenam por age, ou por age e depois name.

Criar um Índice Único

Índices também podem ser usados para impor a integridade dos dados. Um índice único garante que o campo (ou campos) indexado não contenha valores duplicados. Nesta etapa, você criará um índice único para evitar endereços de e-mail duplicados na coleção users.

Vamos criar um índice único no campo email. Isso é feito adicionando a opção { unique: true } ao criar o índice.

db.users.createIndex({ email: 1 }, { unique: true });

Agora que o índice único está implementado, o MongoDB rejeitará qualquer tentativa de inserir ou atualizar um documento se isso resultar em um valor duplicado para o campo email.

Vamos testar isso. Primeiro, tente inserir um documento com um e-mail novo e único. Isso deve ter sucesso.

db.users.insertOne({ name: "Frank", age: 31, email: "frank@example.com" });

Em seguida, tente inserir outro documento com um e-mail existente, como alice@example.com. Esta operação falhará. O bloco try...catch permite que você veja o erro sem ser desconectado do shell mongosh.

try {
  db.users.insertOne({ name: "Fiona", age: 29, email: "alice@example.com" });
} catch (e) {
  print(e);
}

O comando lançará um erro indicando uma violação de chave duplicada. A saída conterá uma mensagem como E11000 duplicate key error collection.

Você pode visualizar seus índices novamente para ver a propriedade de restrição única.

db.users.getIndexes();

Observe a propriedade unique: true no índice email_1 na saída.

[
  ...,
  {
    v: 2,
    key: { email: 1 },
    name: 'email_1',
    unique: true
  }
]

Analisar Uso de Índice com explain()

Criar índices é apenas metade da batalha; você também precisa verificar se o MongoDB os está realmente utilizando para suas consultas. O método explain() é uma ferramenta poderosa para isso, fornecendo informações detalhadas sobre como uma consulta é executada. Esta etapa mostrará como usar explain() para verificar se o MongoDB está utilizando seus índices existentes de forma eficaz.

Vamos analisar uma consulta que encontra usuários de uma determinada idade. Como já temos o índice composto age_-1_name_1 da etapa anterior, o MongoDB pode usar este índice para otimizar a consulta no campo age.

db.users.find({ age: 35 }).explain("executionStats");

Na saída, procure pelo campo executionStats.stage dentro de winningPlan. Você deverá ver o valor IXSCAN, que significa "Index Scan" (Escaneamento de Índice). Isso indica que o MongoDB está utilizando o índice composto existente age_-1_name_1 para localizar rapidamente os documentos relevantes. Você também deverá ver que totalDocsExamined corresponde ao número de documentos retornados, demonstrando a eficiência do uso do índice composto.

Para entender melhor como o MongoDB escolhe os índices, vamos também testar uma consulta que pode se beneficiar do índice de campo único name que criamos anteriormente.

db.users.find({ name: "Alice" }).explain("executionStats");

Esta consulta também deve mostrar IXSCAN como o estágio do plano vencedor, confirmando que o MongoDB está utilizando o índice name_1 que criamos na primeira etapa.

Visualizar e Remover Índices

A parte final do gerenciamento de índices é saber como listá-los e removê-los quando não são mais necessários. Índices não utilizados ainda consomem espaço de armazenamento e adicionam sobrecarga às operações de escrita, portanto, é uma boa prática limpá-los.

Primeiro, vamos obter uma lista completa de todos os índices que você criou até agora na coleção users.

db.users.getIndexes();

Este comando fornece uma visão geral abrangente da sua configuração de índice atual. Suponha que você decida que o índice composto age_-1_name_1 não é mais necessário. Você pode removê-lo usando o método dropIndex(), especificando o nome do índice.

db.users.dropIndex("age_-1_name_1");

Após executar o comando, você receberá uma mensagem de confirmação. Para ter certeza, você pode listar os índices mais uma vez para verificar se ele foi removido.

db.users.getIndexes();

O índice age_-1_name_1 não deve mais aparecer na lista.

Se você precisar remover todos os índices personalizados de uma coleção (exceto o índice padrão _id), você pode usar o método dropIndexes(). Este comando é poderoso, portanto, use-o com cuidado.

// Exemplo: db.users.dropIndexes()

Isso conclui as operações básicas para gerenciar índices no MongoDB. Agora você pode sair do shell mongosh.

exit;

Resumo

Neste laboratório, você aprendeu as habilidades essenciais para trabalhar com índices do MongoDB. Você começou criando um índice básico de campo único para acelerar consultas simples. Em seguida, progrediu para a construção de um índice composto para otimizar consultas envolvendo múltiplos campos. Você também aprendeu como impor a integridade dos dados criando um índice único. Além disso, você usou o método explain() para analisar planos de consulta e confirmar que seus índices estavam sendo usados de forma eficaz, observando a diferença de desempenho entre uma varredura de coleção (collection scan) e uma varredura de índice (index scan). Finalmente, você praticou o gerenciamento de seus índices listando-os e removendo-os. Dominar essas técnicas de indexação é um passo crítico para construir aplicações rápidas e escaláveis com o MongoDB.