Dominando Índices Compostos no MongoDB
Este guia mergulha nas intrincadas nuances dos índices compostos no MongoDB, uma técnica crucial para otimizar o desempenho do banco de dados. Abordaremos tudo, desde a compreensão de seu funcionamento fundamental até a análise de sua eficácia e a solução de problemas comuns.
- Entendendo Índices Compostos
- Criando Índices Compostos
- Consultando com Índices Compostos
- Analisando o Uso de Índices
- Melhores Práticas e Otimização
- Perguntas Frequentes
1. Entendendo Índices Compostos
No MongoDB, um índice composto é um índice que abrange múltiplos campos dentro de um único documento. Diferentemente dos índices de campo único, que apenas aceleram consultas em um único campo, os índices compostos aumentam dramaticamente a velocidade de consultas envolvendo múltiplos campos, impactando significativamente o desempenho da aplicação. A ordem dos campos dentro do índice é crítica; o MongoDB utiliza essa ordem para localizar documentos eficientemente.
Consultas que correspondem aos campos iniciais do índice obtêm o maior benefício. Se uma consulta usa apenas os campos iniciais, o índice é totalmente utilizado tanto para filtragem quanto para ordenação. No entanto, se uma consulta usa campos além do índice, o MongoDB pode utilizar parcialmente o índice, potencialmente recorrendo a uma varredura da coleção para os critérios restantes, negando os ganhos de desempenho.
Por exemplo, considere uma coleção products
com os campos category
, price
e name
. Um índice composto em { "category": 1, "price": -1 }
otimiza consultas filtrando por category
e, em seguida, ordenando por price
em ordem decrescente.
2. Criando Índices Compostos
Criar índices compostos é simples usando o método db.collection.createIndex()
. O argumento é um documento onde as chaves representam os nomes dos campos e os valores representam a ordem de classificação (1 para ascendente, -1 para descendente).
// Criar um índice composto em category (ascendente) e price (descendente)
db.products.createIndex( { category: 1, price: -1 } );
// Criar um índice composto em múltiplos campos, com ordens de classificação variadas
db.users.createIndex( { firstName: 1, lastName: -1, age: 1 } );
// Adicionar opções unique e sparse
db.products.createIndex( { category: 1, price: -1 }, { unique: true, sparse: true } );
unique: true
impõe unicidade nos campos indexados, enquanto sparse: true
indexa apenas documentos onde os campos indexados não são nulos.
3. Consultando com Índices Compostos
O otimizador de consultas do MongoDB utiliza automaticamente um índice composto se a consulta corresponder aos campos iniciais e a ordem de classificação estiver alinhada. Por exemplo, a seguinte consulta se beneficia do índice { "category": 1, "price": -1 }
:
db.products.find( { category: "Electronics" } ).sort( { price: -1 } );
Esta consulta filtra por category
(o campo de índice inicial) e ordena por price
(correspondendo à ordem de classificação do índice). No entanto, esta consulta não se beneficiaria tanto:
db.products.find( { price: { $lt: 100 } } ).sort( { category: 1 } );
price
não é o campo inicial, e a ordem de classificação não está alinhada com o índice.
4. Analisando o Uso de Índices
Use db.collection.find().explain()
para analisar o uso do índice. Isso fornece informações detalhadas sobre o plano de execução da consulta, incluindo quais índices foram usados (ou não) e os tempos de execução.
db.products.find( { category: "Electronics" } ).sort( { price: -1 } ).explain();
Examine a seção “executionStats”. Se o índice for usado, você verá o uso da chave do índice e o número de documentos examinados. “COLLSCAN” indica uma varredura completa da coleção, menos eficiente que o uso do índice.
5. Melhores Práticas e Otimização
A seleção cuidadosa do índice é crucial. O excesso de indexação diminui as operações de gravação, enquanto a sub-indexação leva a consultas ineficientes. Priorize os padrões de consulta usados com frequência, adicionando índices incrementalmente conforme necessário. Monitore o uso do índice regularmente e ajuste com base nas necessidades do aplicativo. Considere usar a interface gráfica do MongoDB Compass para um gerenciamento de índice mais simples.
6. Perguntas Frequentes
- Quantos índices compostos devo criar? O número ideal depende dos padrões de consulta do seu aplicativo. É necessário um equilíbrio para evitar o excesso de indexação.
- E se minha consulta não corresponder perfeitamente ao índice? O MongoDB pode usar partes do índice, mas ainda pode recorrer a uma varredura da coleção para as partes não correspondentes.
- Posso criar índices compostos com campos ascendentes/descendentes mistos? Sim, a ordem é crucial para o desempenho ideal.
- Como excluir um índice composto? Use
db.collection.dropIndex()
, especificando o nome do índice ou a especificação:
// Excluir pelo nome
db.products.dropIndex("category_1_price_-1");
// Excluir pela especificação
db.products.dropIndex( { category: 1, price: -1 } );