Optymalizowanie wydajności zapytań

Aby rozwiązać problemy z powolnymi zapytaniami, użyj funkcji Query Explain aby uzyskać plan wykonania zapytania i profil wykonania w czasie działania. W sekcji poniżej opisujemy czynności, które możesz wykonać, aby zoptymalizować wydajność zapytania w zależności od profilu wykonania:

Ogranicz liczbę wyników

Aby sprawdzić, czy zapytanie zwraca wiele dokumentów, użyj pola recordsReturned (zwrócone rekordy) w drzewie wykonania. Rozważ ograniczenie liczby zwracanych dokumentów za pomocą klauzuli $limit. Zmniejsza to rozmiar serializowanych bajtów wyników zwracanych klientom przez sieć. Jeśli przed węzłem Limit znajduje się węzeł MajorSort, aparat zapytań może połączyć węzły Limit i MajorSort oraz zastąpić pełną materializację i sortowanie w pamięci sortowaniem TopN, co zmniejsza wymagania dotyczące pamięci dla zapytania.

Ogranicz rozmiar dokumentu wynikowego

Aby uniknąć pobierania niepotrzebnych pól, rozważ ograniczenie rozmiaru zwracanego dokumentu za pomocą klauzuli $project. Pomaga to zmniejszyć koszty obliczeń i pamięci związane z przetwarzaniem wyników pośrednich oraz rozmiar serializowanych bajtów wyników zwracanych klientom przez sieć. Jeśli wszystkie pola, do których odwołuje się zapytanie, są objęte indeksem zwykłym (nie wielokluczowym), umożliwia to również pełne pokrycie zapytania przez skanowanie indeksu, co eliminuje konieczność pobierania dokumentów z pamięci podstawowej.

Używaj indeksów

Aby skonfigurować i zoptymalizować indeksy, postępuj zgodnie z tymi instrukcjami.

Sprawdź, czy zapytanie używa indeksu

Aby sprawdzić, czy zapytanie używa indeksu, sprawdź węzły liści w drzewie wykonania. Jeśli węzeł liścia drzewa wykonania jest węzłem TableScan, oznacza to, że zapytanie nie używa indeksu i skanuje dokumenty z pamięci podstawowej. Jeśli używany jest indeks, węzeł liścia drzewa wykonania będzie zawierać identyfikator indeksu i pola indeksu.

Sprawdź, czy używany indeks można zoptymalizować

Indeks jest przydatny w przypadku zapytania, jeśli może zmniejszyć liczbę dokumentów, które aparat zapytań musi pobrać z pamięci podstawowej, lub jeśli kolejność pól może spełnić wymagania dotyczące sortowania zapytania.

Jeśli zapytanie używa indeksu, ale aparat zapytań nadal pobiera i odrzuca wiele dokumentów (co można stwierdzić na podstawie węzła Scan, który zwraca wiele rekordów, a następnie węzła Filter, który zwraca niewiele rekordów), oznacza to, że predykat zapytania spełniony za pomocą indeksu nie jest selektywny. Aby utworzyć bardziej odpowiedni indeks, zapoznaj się z sekcją Tworzenie indeksów.

Jeśli zapytanie używa indeksu innego niż wielokluczowy, ale aparat zapytań nadal wykonuje ponowne sortowanie zestawu wyników w pamięci (co można stwierdzić na podstawie węzła MajorSort w drzewie wykonania zapytania), oznacza to, że używany indeks nie może spełnić wymagań dotyczących sortowania zapytania. Aby utworzyć bardziej odpowiedni indeks, zapoznaj się z następną sekcją.

Optymalizowanie zapytań $lookup

Zapytania $lookup możesz zoptymalizować, dodając indeksy do kolekcji from, co umożliwia operacji efektywne znajdowanie pasujących dokumentów bez skanowania całej kolekcji.

$lookup z localField i foreignField

Jeśli używasz opcji localField i foreignField na etapie $lookup, utwórz indeks w polu foreignField w kolekcji from.

$lookup z zagnieżdżonymi potokami

Jeśli używasz opcji pipeline na etapie $lookup z etapami $match, utwórz indeks w polach w kolekcji obcej, aby uniknąć skanowania całej kolekcji:

  • W przypadku etapów $match z semantyką filtra (np. {$match: {a: true}}) utwórz indeks w polach w kolekcji obcej (a).
  • W przypadku etapów $match z semantyką agregacji, która porównuje pole ze stałą wartością (np. {$match: {$expr: {$gt: [a, 10]}}}) lub z porównaniami równości (eq lub in) między polami a zmiennymi zdefiniowanymi w let (np. {$match: {$expr: {$eq: [a, "$$a"]}}}), utwórz indeks w polach w kolekcji obcej. Pamiętaj, że indeks wielokluczowy nie będzie używany w planowaniu.

Tworzenie indeksów

Aby utworzyć indeksy, postępuj zgodnie z dokumentacją dotyczącą zarządzania indeksami . Aby mieć pewność, że zapytanie może używać indeksów, utwórz zwykłe indeksy (nie wielokluczowe) z polami w tej kolejności:

  1. Wszystkie pola, które będą używane w operatorach równości. Aby zmaksymalizować szansę ponownego użycia w zapytaniach, uporządkuj pola w kolejności malejącej liczby wystąpień pól w operatorach równości w zapytaniach.
  2. Wszystkie pola, które będą sortowane (w tej samej kolejności).
  3. Pola, które będą używane w operatorach zakresu lub nierówności, w kolejności malejącej selektywności ograniczenia zapytania.
  4. Pola, które będą zwracane w ramach zapytania w indeksie: uwzględnienie takich pól w indeksie umożliwia pokrycie zapytania przez indeks i uniknięcie konieczności pobierania dokumentu z pamięci podstawowej.

W przypadku zapytań, które obejmują filtrowanie i sortowanie pól tablicowych, rozważ utworzenie indeksów wielokluczowych.

Użyj wskazówki dotyczącej zapytania

Jeśli utworzysz bardziej odpowiedni indeks dla zapytania, ale aparat zapytań nie będzie go używać, możesz zastąpić preferencje indeksu aparatu zapytań za pomocą wskazówki dotyczącej zapytania.

Więcej informacji o wynikach zapytania wykonanego za pomocą funkcji Query Explain znajdziesz w artykule Informacje o wykonaniu zapytania.