Indexes
Nesta página
Os índices suportam a execução eficiente de consultas no MongoDB. Sem índices, o MongoDB deve verificar todos os documentos de uma coleção para retornar resultados de consulta. Se existir um índice apropriado para uma consulta, o MongoDB usa o índice para limitar o número de documentos que deve digitalizar.
Embora os índices melhorem o desempenho da consulta, adicionar um índice tem impacto negativo no desempenho para operações de gravação. Para coleções com alta taxa de gravação para leitura, os índices são caros porque cada inserção também deve atualizar quaisquer índices.
Casos de uso
Se seu aplicativo estiver executando consultas repetidamente nos mesmos campos, poderá criar um índice nesses campos para melhorar o desempenho. Por exemplo, considere os seguintes cenários:
Cenário | Tipo de índice |
---|---|
Um departamento de recursos humanos geralmente precisa procurar funcionários pelo ID do funcionário. Você pode criar um índice no campo ID do funcionário para o desempenho da consulta. | |
Muitas vezes, um vendedor precisa procurar informações do cliente por localização. A localização é armazenada em um objeto incorporado com campos como Ao criar um índice em um documento incorporado, somente as consultas que especificam todo o documento incorporado utilizam o índice. Consultas em um campo específico do documento não usam o índice. | Índice de campo único em um documento incorporado |
Um gerente de mercearia geralmente precisa pesquisar itens de estoque por nome e quantidade para determinar quais itens estão com pouco estoque. É possível criar um único índice nos campos item e quantity para melhorar o desempenho da consulta. |
Começar
Você pode criar e gerenciar índices no MongoDB Atlas, com um método de driver ou com o MongoDB Shell. O MongoDB Atlas é o serviço totalmente gerenciado para implantações MongoDB na nuvem.
Crie e gerencie índices no MongoDB Atlas
Para implantações hospedadas no MongoDB Atlas, você pode criar e gerenciar índices com a IU do MongoDB Atlas ou a CLI do Atlas. O MongoDB Atlas também inclui um Performance Advisor que recomenda índices para melhorar consultas lentas, classifica os índices sugeridos por impacto e recomenda quais índices devem ser descartados.
Para aprender como criar e gerenciar índices na IU do MongoDB Atlas ou Atlas CLI, consulte Criar, Exibir, Descartar e Ocultar Índices..
Para saber mais sobre o MongoDB Atlas Performance Advisor, consulte Monitorar e melhorar consultas lentas.
Crie e gerencie índices com um método de driver ou shell do MongoDB
Você pode criar e gerenciar índices com um método de driver ou o MongoDB Shell. Para saber mais, consulte os recursos nesta página.
Detalhes
Índices são estruturas de dados especiais que armazenam uma pequena parte do conjunto de dados da coleção em um formato fácil de percorrer. Os índices do MongoDB usam uma estrutura de dados B-tree.
O índice armazena o valor de um campo específico ou conjunto de campos, ordenado pelo valor do campo. A ordenação das entradas do índice suporta correspondências de igualdade eficientes e operações de consulta baseadas em intervalo. Além disso , o MongoDB pode retornar resultados classificados usando a ordenação no índice.
O diagrama a seguir ilustra uma consulta que seleciona e ordena os documentos correspondentes usando um índice:
Fundamentalmente, os índices no MongoDB são semelhantes aos índices de outros sistemas de reconhecimento de data center. O MongoDB define índices no nível de collection e suporta índices em qualquer campo ou subcampo dos documentos em uma collection do MongoDB.
Default _id
Index
O MongoDB cria um índice único no campo _id durante a criação de uma collection. O índice _id
impede que os clientes insiram dois documentos com o mesmo valor para o campo _id
. Você não pode descartar esse índice no campo _id
.
Observação
Em clusters fragmentados, se você não usar o campo _id
como a chave de shard, seu aplicativo deverá garantir a exclusividade dos valores no campo _id
para evitar erros. Na maioria das vezes, isso é feito usando um ObjectId padrão gerado automaticamente.
Crie um índice
➤ Use o menu suspenso Selecione a linguagem no canto superior direito para definir a linguagem dos exemplos nesta página.
Para criar um índice na ,mongo shell use db.collection.createIndex()
.
db.collection.createIndex( <key and index type specification>, <options> )
O exemplo seguinte cria um único índice descendente de chave no campo name
:
db.collection.createIndex( { name: -1 } )
O método db.collection.createIndex()
só cria um índice se um índice da mesma especificação ainda não existir.
Importante
Para criar um índice em uma coleção no MongoDB Compass, a coleção deve conter documentos.
Para criar um índice no MongoDB Compass:
Clique no Create Index botão.
Na aba Índices , clique no botão Create Index para abrir a caixa de diálogo Create Index .
Opcional. Especifique as opções de índice.
O Compass oferece suporte às seguintes opções de índice:
Opção | Descrição | MAIS INFORMAÇÕES | |
---|---|---|---|
Índice de banco de dados em segundo plano | Se marcado, certifique-se de que a implantação do MongoDB permaneça
disponível durante a operação de construção de índice. | ||
Crie um índice único | Se marcado, certifique-se de que os campos indexados
armazenem valores duplicados. | ||
Criar TTL | Se marcada, exclui automaticamente os documentos após um
número especificado de segundos desde o valor do campo indexado. | ||
Expressão de filtro parcial | Se marcada, indexa apenas documentos que correspondam à expressão de filtro especificada. Por exemplo, a seguinte expressão de filtro parcial indexa apenas documentos onde o campo
| ||
Usar agrupamento personalizado | Se marcada, crie um agrupamento personalizado para o índice
usando as opções fornecidas no Compass. | ||
Projeção curinga | Se marcado, oferece suporte a campos desconhecidos ou arbitrários
que correspondem à projeção especificada no índice. |
Para criar um índice usando o driver .NET, use MongoCollection.CreateIndex.
collection.CreateIndex( IndexKeys<collection>.<key and index type specification>, <options> );
O exemplo seguinte cria um único índice descendente de chave no campo name
:
collection.CreateIndex( IndexKeys<collection>.Descending("name") );
O método MongoCollection.CreateIndex só cria um índice se um índice da mesma especificação ainda não existir.
Para criar um índice usando o driver Java Async, use com.mongodb.async.client.MongoCollection.createIndex.
collection.createIndex( <key and index type specification>, <options>, <callbackFunction>)
O exemplo seguinte cria um único índice descendente de chave no campo name
:
collection.createIndex(Indexes.descending("name"), someCallbackFunction());
O com.mongodb.async. cliente.MongoCollection.createIndex o método só cria um índice se um índice da mesma especificação ainda não existir.
Para criar um índice usando o driver Java, use com.mongodb.client.MongoCollection.createIndex.
collection.createIndex( <key and index type specification>, <options> )
O exemplo seguinte cria um único índice descendente de chave no campo name
:
collection.createIndex(Indexes.descending("name"));
O com.mongodb.client.MongoCollection.createIndex. o método só cria um índice se um índice da mesma especificação ainda não existir.
Para criar um índice usando o driver do motor, use motor.motor_asyncio.AsyncIOMotorCollection.create_index
.
await db.collection.create_index([(<key and index type specification>)], <options> )
O exemplo seguinte cria um único índice descendente de chave no campo name
:
await collection.create_index([("name", pymongo.DESCENDING)])
O o método só cria um índice se um índice da mesma especificação ainda não motor.motor_asyncio.AsyncIOMotorCollection.create_index
existir.
Para criar um índice usando o driver Node.JS, use createIndex()
.
collection.createIndex( { <key and index type specification> }, function(err, result) { console.log(result); callback(result); }
O exemplo seguinte cria um único índice descendente de chave no campo name
:
collection.createIndex( { name : -1 }, function(err, result) { console.log(result); callback(result); }
O método createIndex()
só cria um índice se um índice da mesma especificação ainda não existir.
Para criar um índice usando o driver Perl, use create_one().
my $indexes = $db->get_collection( <collection> )->indexes; $indexes->create_one( [ <key and index type specification> ] );
O exemplo seguinte cria um único índice descendente de chave no campo name
:
my $indexes = $db->get_collection( <collection> )->indexes; $indexes->create_one( [ name => -1 ] );
O create_one() o método só cria um índice se um índice da mesma especificação ainda não existir.
Para criar um índice usando o driver PHP, use MongoDB\\Collection::createIndex()
.
$collection->createIndex(<key and index type specification>, <options>);
O exemplo seguinte cria um único índice descendente de chave no campo name
:
$collection->createIndex(['name' => -1]);
O método MongoDB\\Collection::createIndex()
só cria um índice se um índice da mesma especificação ainda não existir.
Para criar um índice usando o driver PyMongo Python, use pymongo.collection.Collection.create_index
.
db.collection.create_index([(<key and index type specification>)], <options> )
O exemplo seguinte cria um único índice descendente de chave no campo name
:
collection.create_index([("name", pymongo.DESCENDING)])
O o método só cria um índice se um índice da mesma especificação ainda não pymongo.collection.Collection.create_index
existir.
Para criar um índice usando o driver Ruby, use Mongo::Index::View#create_one.
client[:collection].indexes.create_one({ <key and index type specification> }, {options})
O exemplo seguinte cria um único índice descendente de chave no campo name
:
client[:collection].indexes.create_one({ name: -1 })
O Mongo::Index::View#create_one o método só cria um índice se um índice da mesma especificação ainda não existir.
Para criar um índice usando o driver Scala,useorg.mongodb.scala.model.Indexes.
collection.createIndex(<key and index type specification>)
O exemplo seguinte cria um único índice descendente de chave no campo name
:
collection.createIndex(descending("name"))
O org.mongodb.scala.model.Indexes o método só cria um índice se um índice da mesma especificação ainda não existir.
[1] | Os índices MongoDB usam uma estrutura de dados B-tree |
Nomes de índice
O nome padrão de um índice é a concatenação das chaves indexadas e da direção de cada chave no índice (ou seja, 1 ou -1) usando sublinhados como separadores. Por exemplo, um índice criado em { item : 1, quantity: -1 }
tem o nome item_1_quantity_-1
.
Você pode criar índices com um nome personalizado, como um que seja mais legível do que o padrão. Por exemplo, considere um aplicativo que consulta frequentemente a coleta products
para preencher dados no inventário existente. O método createIndex()
a seguir cria um índice em item
e quantity
chamado query for
inventory
:
db.products.createIndex( { item: 1, quantity: -1 } , { name: "query for inventory" } )
Você pode visualizar nomes de índice utilizando o método db.collection.getIndexes()
. Você não pode renomear um índice depois de criado. Em vez disso, você deve descartar e recriar o índice com um novo nome.
Tipos de índice
O MongoDB fornece vários tipos de índices que dão suporte a tipos específicos de dados e queries.
Campo Único
Além do índice _id
definido pelo MongoDB, o MongoDB suporta a criação de índices ascendentes/descendentes definidos pelo usuário em um único campo de um documento.
Para um índice de campo único e operações de classificação, a ordem de classificação (ou seja, ascendente ou descendente) da chave do índice não importa porque MongoDB pode percorrer o índice em qualquer direção.
Consulte Índices de Campo Único e Classificar com um Índice de Campo Único para obter mais informações sobre índices de campo único.
Índice composto
O MongoDB também suporta índices definidos pelo usuário em vários campos, ou seja , índices compostos.
A ordem dos campos listados em um índice composto é significativa. Por exemplo, se um índice composto consiste em { userid: 1, score: -1 }
, o índice classifica primeiro por userid
e depois, dentro de cada valor userid
, classifica por score
.
Para índices compostos e operações de classificação, a ordem de classificação (ou seja, ascendente ou descendente) das chaves do índice pode determinar se o índice pode suportar uma operação de classificação. Consulte Ordem de classificação para obter mais informações sobre o impacto da ordem do índice nos resultados em índices compostos.
Veja também:
Multikey Index
O MongoDB usa índices de múltiplas chaves para indexar o conteúdo armazenado em arrays. Se você indexar um campo que contém um valor de array, o MongoDB criará entradas de índice separadas para cada elemento exclusivo do array. Esses índices de várias chaves permitem que as query selecionem documento que contêm matrizes combinando um elemento ou elementos das matrizes. O MongoDB determina automaticamente se deve ser criado um índice de múltiplas chaves se o campo indexado contiver um valor de array; você não precisa especificar explicitamente o tipo de múltiplas chaves.
Consulte Índices de múltiplas chaves e Limites de índices de múltiplas chaves para obter mais informações sobre índices de múltiplas chaves.
Índice Geoespacial
Para suportar consultas eficientes de dados de coordenadas geoespaciais, MongoDB fornece dois índices especiais: índices 2d que utilizam geometria planar ao retornar resultados e índices 2dsphere que utilizam geometria esférica para retornar resultados.
Este índice é um índice esparso. Se você deseja utilizar um índice esparso para criar um índice composto, primeiro revise as considerações especiais de utilizar índices compostos esparsos.
Consulte Índices geoespaciais para uma introdução de alto nível aos índices geoespaciais.
índice de pesquisa de texto
Para dados hospedados no MongoDB Atlas, você pode oferecer suporte à Full Text Search com índices Atlas Search. Para saber mais, consulte Criar um Índice do Atlas Search.
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.
Este índice é um índice esparso. Se você deseja utilizar um índice esparso para criar um índice composto, primeiro revise as considerações especiais de utilizar índices compostos esparsos.
Índices com hash
Para oferecer suporte à fragmentação baseada em hash, o MongoDB fornece um tipo de índice hash , que indexa o hash do valor de um campo. Esses índices têm uma distribuição mais aleatória de valores ao longo de seu intervalo, mas suportam apenas correspondência de igualdade e não podem suportar query baseadas em intervalo.
Índices curinga
A partir do MongoDB 4.2, você pode usar índices curinga para oferecer suporte a query em campo múltiplos, arbitrários ou desconhecidos. Ao criar um índice curinga, você especifica $**
para representar todos os campos ou todos os valores, permitindo indexar qualquer um dos itens a seguir com um único comando:
Todos os valores de um campo
Todos os campos de um documento
Todos os campo de um documento, exceto caminho do campo específicos
Vários campos específicos em um documento
Para saber mais, consulte Índices curinga.
Propriedades do índice
Unique Indexes
A propriedade única de um índice faz com que MongoDB rejeite valores duplicados para o campo indexado. Além da restrição exclusiva, os índices únicos são funcionalmente intercambiáveis com outros índices do MongoDB.
Índices Parciais
Novo na versão 3.2.
Os índices parciais indexam apenas os documentos em uma collection que atendem a uma expressão de filtro especificada. Ao indexar um subconjunto de documentos em uma collection, os índices parciais têm requisitos de armazenamento mais baixos e custos de desempenho reduzidos para criação e manutenção de índices.
Os índices parciais oferecem um superconjunto da funcionalidade dos índices esparsos e devem ser preferidos aos índices esparsos.
Sparse Indexes
A propriedade esparsa de um índice garante que o índice contenha apenas entradas para documentos que tenham o campo indexado. O índice ignora documentos que não possuem o campo indexado.
Você pode combinar a opção de índice esparso com a opção de índice exclusivo para evitar a inserção de documentos que possuem valores duplicados para o (s) campo(s) indexado(s) e ignorar a indexação de documentos que não possuem o(s) campo(s) indexado(s).
TTL Indexes
Os índices TTL são índices especiais que o MongoDB pode usar para remover automaticamente documento de uma collection após um determinado período de tempo. Isso é ideal para determinados tipos de informações como dados de evento gerados por máquina, logs e informações de sessão, que só precisam persistir em um reconhecimento de data center por um período de tempo finito.
Consulte: Expirar dados de coleções configurando TTL para obter instruções de implementação.
Hidden Indexes
Novidades na versão 4.4.
Os índices ocultos não são visíveis para o planejador de query e não podem ser usados para dar suporte a uma query.
Ao ocultar um índice do planejador, os usuários podem avaliar o impacto do descarte de um índice sem realmente descartá-lo. Se o impacto for negativo, o usuário poderá exibir o índice em vez de recriar um índice descartado. E, como os índices são totalmente mantidos enquanto estão ocultos, eles ficam imediatamente disponíveis para uso quando são exibidos.
Exceto o índice _id
, você pode ocultar qualquer índice.
Uso do índice
Os índices podem melhorar a eficiência das operações de leitura. O tutorial Analisar o Desempenho da query fornece um exemplo das estatísticas de execução de uma query com e sem um índice.
Para obter informações sobre como o MongoDB escolhe um índice para usar, consulte otimizador de query.
Índices e agrupamento
Novidade na versão 3.4.
A colocação permite que os usuários especifiquem regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e marcas de acento.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do MongoDB Compass para obter instruções sobre o uso de agrupamento personalizado com índices no Compass.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Observação
Os exemplos a seguir ilustram índices e agrupamento no mongosh
.
Consulte a documentação do driver para obter instruções sobre como criar índices com agrupamento em seu driver específico.
Para usar um índice para comparações de strings, uma operação também deve especificar o mesmo agrupamento. Ou seja, um índice com ordenação não pode suportar uma operação que executa comparações de strings nos campos indexados se a operação especificar uma ordenação diferente.
Aviso
Porque os índices configurados com agrupamento usam ICU. chaves de agrupamento para obter a ordem de classificação, chaves de índice com reconhecimento de agrupamento pode ser maior do que as chaves de índice para índices sem agrupamento.
Por exemplo, a coleta myColl
possui um índice em um campo de sequência category
com o código do idioma de ordenação "fr"
.
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
A seguinte operação de consulta, que especifica o mesmo agrupamento que o índice, pode usar o índice:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
No entanto, a seguinte operação de consulta, que por padrão usa o agrupador binário "simples", não pode usar o índice:
db.myColl.find( { category: "cafe" } )
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, a coleta myColl
possui um índice composto nos campos numéricos score
e price
e no campo de string category
; o índice é criado com a localidade de ordenação "fr"
para comparações de strings:
db.myColl.createIndex( { score: 1, price: 1, category: 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.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
A operação a seguir, que usa agrupamento binário "simple"
para comparações de strings no campo category
indexado, pode usar o índice para preencher apenas a parte score: 5
da query:
db.myColl.find( { score: 5, category: "cafe" } )
Importante
As correspondências com chaves de documentos, incluindo chaves de documentos incorporadas, usam uma comparação binária simples. Isto significa que uma query para uma chave como "foo.bár" não corresponderá à chave "foo.bar", independente do valor definido para o parâmetro de força.
Para obter mais informações sobre agrupamento, consulte a página de referência de agrupamento.
Os índices a seguir oferecem suporte apenas à comparação binária simples e não oferecem suporte ao agrupamento:
índices de texto ,
Índices 2d e
índices do geoHaystack .
Queries cobertas
Quando os critérios de consulta e a projeção de uma consulta incluem apenas os campos indexados, o MongoDB retorna resultados diretamente do índice sem digitalizar documentos ou trazê-los para a memória. Essas query cobertas podem ser muito eficientes.
Para mais informações sobre query cobertas, consulte query Coberta.
Interseção de índice
MongoDB pode usar a interseção de índices para atender às query. Para query que especificam condições de query compostas, se um índice puder atender uma parte de uma condição de query e outro índice puder atender outra parte da condição de query, então o MongoDB poderá usar a interseção dos dois índices para atender a query. Se o uso de um índice composto ou de uma interseção de índice é mais eficiente depende da query e do sistema.
Para obter detalhes sobre a interseção do índice, consulte Interseção do índice.
Restrições
Certas restrições se aplicam aos índices, como o comprimento das chaves do índice ou o número de índices por collection. Consulte Limitações de Índice para obter detalhes.
Considerações adicionais
Embora os índices possam melhorar o desempenho das consultas, os índices também apresentam algumas considerações operacionais. Consulte Considerações operacionais para índices para obter mais informações.
Durante a construção de índice, os aplicativos podem encontrar desempenho reduzido ou acesso limitado de leitura/gravação à coleção que está sendo indexada.
Para obter mais informações sobre o processo de construção de índices, consulte Construções de índices em collection preenchidas, especialmente a seção Construções de índices em ambientes replicados .
Alguns drivers usam NumberLong(1)
em vez de 1
para especificar a ordem do índice. Os índices resultantes são os mesmos.