Jeśli zapytanie może być spełnione przez wiele indeksów zdefiniowanych w kolekcji, MongoDB przetestuje wszystkie odpowiednie indeksy równolegle. Planer zapytań wybierze pierwszy indeks, który może zwrócić 101 wyników. Istnieją inne aspekty wyboru indeksu, ale ogólnie jest to prawdą, zgodnie z Optymalizacja zapytań dokumentacja.
Ten sposób wyboru indeksu może wybrać indeks suboptymalny. Dzieje się tak, ponieważ z punktu widzenia MongoDB masz wiele indeksów opisujących to samo. Aby złagodzić zaobserwowany nieoptymalny wybór indeksu, możesz wykonać następujące czynności:
-
Usuń wszystkie inne indeksy, które według Ciebie są nieoptymalne.
Ma to na celu upewnienie się, że planista zapytań nie ma innego wyboru poza wyborem indeksów dostosowanych do zapytania.
-
Użyj
hint()
metodahint()
umożliwia jawne poinformowanie MongoDB, aby używał określonego indeksu dla zapytania. Na przykład:db.tasks.find(...).hint({project: 1, created_by: 1})
Zobacz https://docs.mongodb.com/v2. 6/odniesienie/operator/meta/podpowiedź/ aby uzyskać więcej informacji na temat
hint()
.
Innym niuansem w zapytaniu jest to, że zawiera ono $or
operator. W takim przypadku każdy termin w $or
wyrażenie musi mieć powiązany z nim indeks , w przeciwnym razie MongoDB wykona skanowanie kolekcji (BasicCursor
w terminach MongoDB 2.6). Jest to wyjaśnione bardziej szczegółowo na https://docs .mongodb.com/v2.6/reference/operator/query/lub/#zachowania