Um índice cobre uma query quando o índice contém todos os campos verificados pela query. Uma query coberta analisa o índice e não a collection, o que melhora o desempenho da query.
Os índices também podem suportar parcialmente queries se um subconjunto dos campos consultados for indexado.
Sobre esta tarefa
Uma única collection pode ter um máximo de 64 índices. No entanto, muitos índices podem degradar o desempenho antes que esse limite seja atingido. Para coletas com alta taxa de gravação para leitura, os índices podem degradar o desempenho porque cada inserção também deve atualizar quaisquer índices.
Passos
Identificar queries comuns
Para identificar padrões de query comuns em seu aplicação, use o estágio de agregação $queryStats . $queryStats reporta métricas para formas de query, que agrupam queries com base em campos compartilhados.
Criar índices para dar suporte a queries comuns
Depois de saber quais campos seu aplicação consulta com frequência, você pode criar índices para dar suporte a consultas nesses campos. Para mais informações, consulteExemplos do .
Analisar o uso do índice
Depois que seu aplicação começar a usar índices, você poderá analisar a eficácia dos índices. Para ver as estatísticas e o uso do índice, você pode:
Use o estágio de agregação
$indexStats.Para MongoDB Atlas , visualize índices na interface do usuário do Atlas .
Considere excluir índices não utilizados para melhorar o desempenho do aplicação . Para mais informações, consulte Remover índices desnecessários.
Repita este procedimento periodicamente para garantir que seus índices suportem seu volume de trabalho atual.
Exemplos
Os exemplos nesta página utilizam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Observação
Os documentos na coleção movies contêm campos adicionais não mostrados aqui.
Criar um índice de chave única
Se seu aplicação consultar somente uma única chave em uma determinada coleta, você precisará criar um índice de chave única para essa coleta. Por exemplo, você pode criar um índice em title na coleção movies :
db.movies.createIndex( { title: 1 } )
Este índice suporta esta query:
db.movies.find( { title: 'Mulholland Drive' } )
Criar um índice composto
Se seu aplicação executar queries em uma única chave e em várias chaves, um índice composto será mais eficiente do que um índice de chave única. Por exemplo, você pode criar um índice nos campos year, runtime e title :
db.movies.createIndex( { year: 1, runtime: 1, title: 1 } )
Prefixos de índices
Um índice composto suporta queries sobre prefixos de índice, que são os subconjuntos iniciais de campos indexados. Por exemplo, o índice anterior suporta esta query:
db.movies.find( { year: 2012, runtime: { $gt: Decimal128( "120" ) } }, { title: 1 } )
Para obter mais informações e considerações de desempenho sobre prefixos de índice, consulte Prefixos de índice.
Crie índices para oferecer suporte a queries $text
Para dados hospedados no MongoDB, você pode suportar pesquisa de texto completo com índices de pesquisa MongoDB Search. Para saber mais, consulte Criar um índice de pesquisa MongoDB.
Para implantações autogerenciadas (não Atlas), o MongoDB fornece um tipo de índice text que suporta a pesquisa de conteúdo de string de caracteres em uma coleção. Para saber mais sobre índices de texto autogerenciados, consulte Índices de texto em implantações autogerenciadas.
Crie índices de Vector Search
Os índices de Vector Search oferecem suporte a queries sobre incorporações vetoriais. Para criar índices de Vector Search , consulte Campos de índice para Vector Search.
Uso do Índice e Agrupamento
Para usar um índice para comparações de strings, uma operação também deve especificar o mesmo agrupamento. Se uma operação especificar um agrupamento diferente da especificada pelo índice, o índice não poderá suportar comparações de strings nos campos indexados.
Aviso
As chaves de índice com reconhecimento de agrupamento podem ser maiores do que as chaves de índice para índices sem agrupamento porque os índices configurados com agrupamento usam chaves de agrupamento ICU para obter a ordem de classificação.
Use o seguinte código para criar um índice na coleção movies do banco de dados sample_mflix com o locale de agrupamento "fr" para comparações de strings:
db.movies.createIndex( { title: 1 }, { collation: { locale: "fr" } } )
A consulta a seguir, que especifica o mesmo agrupamento que o índice, pode usar o índice:
db.movies.find( { title: "Les Misèrables" }, { title: 1, year: 1 } ).collation( { locale: "fr" } )
No entanto, a seguinte operação de consulta, que por padrão utiliza o agrupador binário "simples", não pode utilizar o índice e exige um COLLSCAN.
db.movies.find( { title: "Les Misèrables" }, { title: 1 , year: 1 } )
Para um índice composto em que as chaves de prefixo do índice não são strings, matrizes e documentos incorporados, uma operação que especifica um agrupamento diferente ainda pode usar o índice para dar suporte a comparações nas chaves de prefixo do índice.
Por exemplo, você pode usar o código a seguir para criar um índice composto na coleção movies do banco de dados sample_mflix, especificando os campos numéricos year e metacritic e o campo de string title. O índice também especifica a locale de agrupamento "fr" para comparações de strings:
db.movies.createIndex( { year: 1, metacritic: 1, title: 1 }, { collation: { locale: "fr" } } )
As operações a seguir, que usam agrupamento binário "simple" para comparações de strings, podem usar o índice:
db.movies.find( { year: 2012 }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
db.movies.find( { year: 2012, metacritic: { $gt: Decimal128( "50" ) } }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
A operação a seguir, que usa agrupamento binário "simple" para comparações de strings no campo title indexado, pode usar o índice para preencher apenas a parte year: 2012 da query:
db.movies.find( { year: 2012, title: "Les Misèrables" }, { year: 1, title: 1 } )
Para confirmar se uma query usou um índice, execute a query com a opção explain().
Importante
As correspondências com chaves de documento , incluindo chaves de documento incorporado , usam comparação binária simples. Isso significa que uma query para uma chave como "type.café" não corresponderá à chave "type.cafe", independentemente do valor definido para o parâmetro de força.