MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dlaczego różne plany zapytań MongoDB pokazują różne wartości nReturned?

Zostało to wyjaśnione w trybie allPlansExecution strona dokumentacji. Parafrazując:

Podczas wyboru planu, jeśli istnieje więcej niż jeden indeks, który może spełnić zapytanie, MongoDB uruchomi wersję próbną, używając wszystkich poprawnych planów, aby określić, który z nich okazał się najlepszy. Zobacz Plany zapytań aby uzyskać szczegółowe informacje dotyczące tego procesu.

Począwszy od MongoDB 3.4.6, wybór planu obejmuje równoległe uruchamianie planów kandydatów w „wyścigu” i sprawdzanie, który plan kandydujący zwraca 101 wyników jako pierwszy. W powyższym przykładzie, zanim zwycięski plan zwrócił 101 wyników w wyścigu, przegrany plan zdołał uzyskać tylko 2 wyniki. Zwycięski plan zostaje następnie zrealizowany do końca. To jest powód, dla którego przegrany plan pokazuje tylko nReturned: 2 w statystykach.

Ten „wyścig” jest wykonywany, ponieważ jeśli istnieją dwa identycznie wyglądające plany, MongoDB nie wie, który plan jest najlepszy dla danego zapytania ze względu na elastyczność dokumentów JSON (w przeciwieństwie do np. SQL, gdzie struktura tabel jest znana) . Oczywiście jest całkowicie możliwe, że MongoDB zgadnie źle i skończy z mniej niż wydajnym planem, ponieważ jest to proces empiryczny. Z tego powodu najlepiej jest tworzyć indeksy obsługujące zapytania, aby MongoDB nie musiał zgadywać. W przeciwnym razie możesz użyć hint() aby poinformować MongoDB, którego indeksu użyć dla określonego zapytania.

Stąd:

  • Statystyki zwycięskiego planu to rzeczywiste statystyki wyników zapytania.
  • Statystyki przegranych planów pokazują tylko statystyki dla przebiegu próbnego planowania zapytań.
  • Wybór planu polega na przeprowadzeniu „wyścigu” do 101 wyników. Ten wyścig jest wykonywany tylko wtedy, gdy istnieje wiele indeksów, które mogą spełnić zapytanie.

Uwaga 1 :Żaden z dwóch planów, które widziałeś, nie był świetny. Zwycięski plan pokazuje "nReturned" : 43 , "totalKeysExamined" : 221 i "totalDocsExamined" : 219 . Oznacza to, że MongoDB musi przeanalizować 219 dokumentów tylko po to, by zwrócić 43 z nich:tylko 20% wydajności . Najlepiej, jeśli chcesz mieć nReturned liczby równe totalDocsExamined .

Uwaga 2 :Spróbuj utworzyć indeks złożony {'rack_name': 1, 'timestamp': 1} . Przy tym samym zapytaniu powinieneś otrzymać lepszy numer wydajności.

Uwaga 3 :Zauważ, że od allPlansExecution określono, wszystkie statystyki są należycie zwracane przez MongoDB w celu zapewnienia dokładności, podczas gdy nie mają one żadnego wpływu na końcowy nReturned wynik. Był to plan odrzucony, a nReturned: 2 numer może być mylące. Nie zobaczysz tych statystyk, jeśli użyjesz executionStats ustawienie. Przede wszystkim allPlansExecution służy do dostrajania i określania, dlaczego niektóre plany są odrzucane.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zbudować ten LEFT() SQL w zapytaniu MongoDB?

  2. Networkx nigdy nie kończy obliczania centralności między dwoma milionami węzłów

  3. Filtruj dokumenty według odległości przechowywanej w dokumencie za pomocą $blisko

  4. MongoDB aktualizuje wszystkie pola błędu tablicy

  5. Jak połączyć się z mongoDB Atlas za pomocą mangusty?