Nie masz żadnego indeksu, którego mongo automatycznie użyje do tego, więc wykonuje pełne skanowanie tabeli.
Jak wspomniano w dokumentacji
Dlaczego
Jeśli masz indeks na a,b - i szukasz według a
sam - indeks zostanie użyty automatycznie. Dzieje się tak, ponieważ jest to początek indeksu (co jest szybkie do zrobienia), db może po prostu zignorować resztę wartości indeksu.
Indeks na a,b jest nieefektywny podczas wyszukiwania według b
po prostu dlatego, że nie daje możliwości korzystania z wyszukiwania indeksu z "zaczyna się od tego ustalonego ciągu".
Tak więc:
- Uwzględnij _reference_1_id w zapytaniu (prawdopodobnie nieistotne)
- LUB dodaj indeks na _reference_2_id (jeśli często wykonujesz zapytania według tego pola)
- LUB użyj podpowiedzi
Wskazówka
Prawdopodobnie teraz jest to najtańsza opcja.
Dodaj wskazówkę dotyczącą zapytania, aby wymusić użycie _reference_1_id_1__reference_2_id_1_id_1
indeks. Co prawdopodobnie będzie dużo szybsze niż pełne skanowanie tabeli, ale nadal dużo wolniejsze niż indeks rozpoczynający się od pola, którego używasz w zapytaniu.
czyli
db.mycoll
.find({"_reference_2_id" : ObjectId("jkl7890123456")})
.hint("_reference_1_id_1__reference_2_id_1_id_1");