Crie índices para oferecer suporte a suas queries
Nesta página
Um índice suporta uma query quando o índice contém todos os campos verificados pela query. A query analisa o índice, e não a collection. A criação de índices que suportam queries resulta em um grande aumento no desempenho da query.
Este documento descreve estratégias para criar índices que suportam queries.
Criar um índice de chave única se todas as queries usarem a mesma chave única
Se você só query uma única chave em determinada coleção, então você precisa
para criar apenas um índice de chave única para essa coleção. Por exemplo, você pode criar um índice em category
na coleção product
:
db.products.createIndex( { "category": 1 } )
Crie índices compostos para oferecer suporte a diversas queries diferentes
Se, às vezes, você fizer query de apenas uma chave e, outras vezes, fizer query dessa
chave combinada com uma segunda chave, a criação de um índice composto será mais
eficiente do que a criação de um índice de chave única. O MongoDB usará o índice
composto para ambas as queries. Por exemplo, você pode criar um índice em category
e item
.
db.products.createIndex( { "category": 1, "item": 1 } )
Isso permite ambas as opções. Você pode consultar apenas category
e também pode consultar category
combinado com item
. Um único índice composto em vários campos pode suportar todas as consultas que pesquisam um subconjunto de "prefixo" desses campos.
Exemplo
O seguinte índice em uma coleção:
{ x: 1, y: 1, z: 1 }
Pode suportar queries que os seguintes índices são compatíveis:
{ x: 1 } { x: 1, y: 1 }
Existem algumas situações em que os índices de prefixo podem oferecer melhor desempenho da query: por exemplo, se z
for uma array grande.
O índice { x: 1, y: 1, z: 1 }
também pode suportar muitas das mesmas queries que o seguinte índice:
{ x: 1, z: 1 }
Além disso, { x: 1, z: 1 }
tem um uso adicional. Dada a seguinte
query:
db.collection.find( { x: 5 } ).sort( { z: 1} )
O índice { x: 1, z: 1 }
oferece suporte à operação de classificação e à query, enquanto o índice { x: 1, y: 1, z: 1 }
oferece suporte apenas à query. Para obter mais informações sobre classificação, consulte Usar índices para classificar os resultados da query.
A partir da versão 2.6, o MongoDB pode usar a interseção de índices para atender a consultas. A escolha entre criar índice composto que suporte suas query ou confiar na interseção de índices depende das especificidades do seu sistema. Consulte Interseção de índices e índices compostos para obter mais detalhes.
Crie índices para dar suporte à pesquisa de texto
Para dados hospedados no MongoDB Atlas, você pode oferecer suporte à Full Text Search com índices Atlas Search. Para saber mais, consulte Create an Atlas Search Index.
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.
Uso do Índice e Agrupamento
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.