Se uma consulta puder ser satisfeita por vários índices definidos na coleção, o MongoDB testará todos os índices aplicáveis em paralelo. O primeiro índice que pode retornar 101 resultados será selecionado pelo planejador de consulta. Existem outras facetas para a seleção do índice, mas em geral isso é verdade de acordo com o Otimização de consulta documentação.
Este método de seleção de índice pode selecionar um índice sub-ótimo. Isso ocorre porque, do ponto de vista do MongoDB, você tem vários índices que descrevem a mesma coisa. Para mitigar a seleção de índice abaixo do ideal que você observou, você pode fazer:
-
Remova todos os outros índices que você descobrir que não são ideais.
Isso é para garantir que o planejador de consulta não tenha outra escolha, exceto escolher índices que você adaptou para sua consulta.
-
Use ahint()
método
hint()
permite que você diga explicitamente ao MongoDB para usar o índice prescrito para a consulta. Por exemplo:
db.tasks.find(...).hint({project: 1, created_by: 1})
Consulte https://docs.mongodb.com/v2. 6/reference/operator/meta/hint/ para mais informações sobrehint()
.
Outra nuance em sua consulta é que ela inclui um
$or
operador. Nesse caso, todos os termos no $or
expressão deve ter um índice associado a ela , caso contrário o MongoDB irá realizar uma varredura de coleção (BasicCursor
nos termos do MongoDB 2.6). Isso é explicado em mais detalhes em https://docs .mongodb.com/v2.6/reference/operator/query/or/#behaviors