O otimizador de consulta do MongoDB funciona tentando diferentes planos para determinar qual abordagem funciona melhor para uma determinada consulta. O plano vencedor para esse padrão de consulta é armazenado em cache para as próximas ~1.000 consultas ou até que você faça um
explain()
. Para entender quais planos de consulta foram considerados, você deve usar
explain(1)
, por exemplo:db.col.find({category:'A'}).sort({updated: -1}).explain(1)
Os
allPlans
detalhe mostrará todos os planos que foram comparados. Se você executar uma consulta que não é muito seletiva (por exemplo, se muitos registros corresponderem aos seus critérios de
{category: { $ne:'A'}}
), pode ser mais rápido para o MongoDB encontrar resultados usando um BasicCursor (varredura de tabela) em vez de corresponder a um índice. A ordem dos campos na consulta geralmente não faz diferença para a seleção do índice (há algumas exceções com consultas de intervalo). A ordem dos campos em uma classificação afeta a seleção do índice. Se o seu
sort()
os critérios não correspondem à ordem do índice, os dados do resultado devem ser reordenados após o índice ser usado (você deverá ver scanAndOrder:true
na saída de explicação se isso acontecer). Também vale a pena notar que o MongoDB usará apenas um índice por consulta (com exceção de
$or
s). Então, se você está tentando otimizar a consulta:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
Você desejará incluir todos os três campos no índice:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
Para sua informação, se você deseja forçar uma consulta específica a usar um índice (geralmente não necessário ou recomendado), existe uma
hint()
opção que você pode tentar.