Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Otimização de Consulta

Nesta página

  • Crie um índice para dar suporte às operações de leitura
  • Seletividade da query
  • Query coberta
  • Exemplo
  • Documentos incorporados
  • Cobertura de múltiplas chaves
  • Desempenho
  • Limitações
  • explain

Os índices melhoram a eficiência das operações de leitura, reduzindo a quantidade de dados que as operações de query precisam processar. Isso simplifica o trabalho associado ao processamento de queries no MongoDB.

Se seu aplicação realizar uma query na collection sobre um determinado campo ou conjunto de campos, então um índice no campo da query ou umíndice composto no conjunto de campos pode impedir que a query verifique toda a collection para encontrar e retornar os resultados da query . Para obter mais informações sobre índices, consulte a documentação completa de índices no MongoDB.

Exemplo

Um aplicativo query a collection inventory no campo type . O valor do campo type é orientado ao usuário.

var typeValue = <someUserInput>;
db.inventory.find( { type: typeValue } );

Para melhorar o desempenho dessa query, adicione um índice crescente ou decrescente à coleção inventory no campo type . [1] No mongosh, você pode criar índices utilizando o método db.collection.createIndex() :

db.inventory.createIndex( { type: 1 } )

Esse índice pode impedir que a query acima em type verifique toda a collection para retornar os resultados.

Para analisar o desempenho da query com um índice, consulte Interpretar os resultados do plano de explicação.

Além de otimizar operações de leitura, os índices podem oferecer suporte a operações de classificação e permitir uma utilização mais eficiente do armazenamento. Consulte db.collection.createIndex() e Índices para mais informações sobre a criação de índices.

[1] Para índices de campo único, a seleção entre ordem crescente e decrescente é irrelevante. Para índices compostos, a seleção é importante. Consulte a ordem de indexação para saber mais.

A seletividade da query refere-se à eficiência com a qual o predicado da query exclui ou filtra documentos em uma collection. A seletividade da query pode determinar se as queries podem usar índices de forma eficaz ou não, ou sequer usá-los.

Queries mais seletivas correspondem a uma porcentagem menor de documentos. Por exemplo, uma correspondência de igualdade no campo _id único é altamente seletiva, pois pode corresponder a no máximo um documento.

Queries menos seletivas fazem correspondência de uma percentagem maior de documentos. Queries menos seletivas não podem usar índices de forma eficaz, ou sequer usá-los.

Por exemplo, os operadores de desigualdade $nin e $ne não são muito seletivos, pois geralmente correspondem a uma grande parte do índice. Como resultado, em muitos casos, uma query $nin ou $ne com um índice pode ter um desempenho não melhor do que uma query $nin ou $ne, que deve digitalizar todos os documentos em uma collection.

A seletividade do regular expressions depende das próprias expressões. Para detalhes, consulte expressão regular e uso de índice.

Uma query coberta é uma query que pode ser satisfeita inteiramente usando um índice e não precisa examinar nenhum documento. Um índice cobre uma query quando todas as opções a seguir se aplicam:

  • Todos os campos na query (conforme especificados pelo aplicativo e conforme necessários internamente, como para fins de fragmentação) fazem parte de um índice.

  • todos os campos retornados nos resultados estão no mesmo índice.

  • Nenhum campo na query é igual a null. Por exemplo, os seguintes predicados de consulta não podem resultar em consultas cobertas:

    • { "field": null }

    • { "field": { $eq: null } }

Uma coleção inventory tem o seguinte índice nos campos type e item:

db.inventory.createIndex( { type: 1, item: 1 } )

O índice abrange a seguinte operação que consulta os campos type e item e retorna apenas o campo item :

db.inventory.find(
{ type: "food", item:/^c/ },
{ item: 1, _id: 0 }
)

Para o índice especificado cobrir a query, o documento de projeção deve especificar explicitamente _id: 0 para excluir o campo _id do resultado, já que o índice não inclui o campo _id .

Um índice pode cobrir uma query em campos dentro de documentos incorporados.

Por exemplo, considere uma coleção userdata com documentos do seguinte formato:

db.userdata.insertOne(
{ _id: 1, user: { login: "tester" } }
)

A collection tem o seguinte índice:

db.userdata.createIndex(
{ "user.login": 1 }
)

O índice { "user.login": 1 } abrange a seguinte consulta:

db.userdata.find(
{ "user.login": "tester" },
{ "user.login": 1, _id: 0 }
)

Observação

Para indexar campos em documentos incorporados, use notação de ponto. Consulte Criar um índice em um campo incorporado.

Os índices de múltiplas chaves podem cobrir queries sobre os campos que não são da array se o índice acompanhar qual(is) campo(s) faz(em) com que o índice seja de múltiplas chaves.

Os índices com várias chaves não podem cobrir queries em campos de array.

Para obter um exemplo de uma consulta coberta com um índice multichave, consulte Consultas cobertas na página de índices multichave.

Como o índice contém todos os campos exigidos pela query, o MongoDB pode corresponder às condições da query e retornar os resultados usando apenas o índice.

Uma query apenas do índice pode ser muito mais rápido do que uma query de documentos fora do índice. As chaves de índice são normalmente menores do que os documentos que elas catalogam, e os índices geralmente estão disponíveis na RAM ou localizados sequencialmente no disco.

Nem todos os tipos de índices podem cobrir consultas. Para obter detalhes sobre o suporte ao índice coberta, consulte a página de documentação para o tipo de índice correspondente.

Ao executar no mongos, os índices somente podem cobrir queries em collections fragmentadas se o índice contiver a chave de shard.

Para determinar se uma query é uma query coberta, utilize o método db.collection.explain() ou explain(). Consulte Consultas cobertas.

Voltar

Consistência causal