W takim przypadku indeks nie pomaga, ponieważ pasujący zestaw wyników składa się z prawie całej kolekcji. Oznacza to, że musi ładować się do pamięci RAM i przemierzać większość indeksu, a także ładować do pamięci RAM i przeszukiwać same dokumenty.
Bez indeksu wykonałby po prostu skanowanie tabeli, sprawdzając każdy dokument i zwracając, jeśli zostanie dopasowany.
W takich przypadkach, gdy zapytanie zwróci prawie całą kolekcję, indeks może nie być pomocny.
Dodanie .limit() przyspieszy zapytanie. Możesz także zmusić optymalizator zapytań, aby nie używał indeksu za pomocą .hint():
db.collection.find().hint({$natural:1})
Możesz również wymusić, aby zapytanie dostarczało wartości wyników bezpośrednio z samego indeksu, ograniczając wybrane pola tylko do tych, które zostały zindeksowane. Pozwala to uniknąć konieczności ładowania jakichkolwiek dokumentów po wykonaniu skanowania indeksu.
Spróbuj tego i sprawdź, czy dane wyjściowe wyjaśniania wskazują "indexOnly":true
db.numbers.find({number: {$gt: 10000}}, {number:1}).explain()
Szczegóły tutaj: