Ten rozdział wprowadza analizę wydajności zapytań MongoDB, podobnie jak w przypadku SQL, MongoDB również obsługuje funkcję explain do analizy wydajności instrukcji zapytania.

Podstawowe użycie

Poprzez wywołanie funkcji explain, można uzyskać wynik analizy

// Wynik analizy metody find
db.kolekcja.find({}).explain();

// Wynik analizy metody aggregate
db.kolekcja.explain().aggregate([]);

Funkcja explain posiada trzy tryby:

  • queryPlanner (domyślny)
  • executionStats
  • allPlansExecution

Wyjaśnienie:

  • Użycie queryPlanner tylko wyświetla wszystkie możliwe plany wykonania, nie wykonuje faktycznej operacji i wyświetla zwycięski plan, który został już wybrany.
  • Użycie executionStats wykonuje tylko zwycięski plan i generuje wynik.
  • Użycie allPlansExecution wykonuje wszystkie plany i generuje wyniki.

Użycie różnych trybów

// Tryb executionStats, wystarczy przekazać parametry do funkcji explain
db.kolekcja.find({}).explain('executionStats');

// Tryb allPlansExecution
db.kolekcja.find({}).explain('allPlansExecution');

Objasnienie zawartości explain

Zawartość queryPlanner

Poniższa zawartość jest domyślną zawartością zwracaną przez explain, pomijając informacje nieważne

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.orders",
		"indexFilterSet" : false, // Kluczowa miara, czy dane filtrowania indeksu są używane
		"winningPlan" : {
			"stage" : "COLLSCAN",  // Kluczowa miara, nazwa fazy etapu. Każda faza ma swoje specyficzne informacje, np. COLLSCAN oznacza przeszukiwanie całej zawartości kolekcji
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	}
	...
}

Typy faz etapów są następujące:

  • COLLSCAN: Pełne przeszukiwanie tabeli
  • IXSCAN: Przeszukiwanie indeksu
  • FETCH: Pobieranie konkretnych dokumentów na podstawie indeksu
  • SHARD_MERGE: Scalanie danych zwróconych przez każdy shard
  • SORT: Wskazuje sortowanie w pamięci
  • LIMIT: Ograniczenie liczby zwracanych wyników
  • SKIP: Pomijanie używania
  • IDHACK: Zapytanie dla _id
  • SHARDING_FILTER: Zapytanie danych rozproszonych przez mongos
  • COUNT: Operacje zliczania za pomocą db.coll.explain().count() lub podobne
  • COUNTSCAN: Faza zwracana, gdy zliczanie nie używa indeksu do zliczania
  • COUNT_SCAN: Faza zwracana, gdy zliczanie używa indeksu do zliczania
  • SUBPLA: Faza zwracana dla zapytań $or, które nie używają indeksów
  • TEXT: Faza zwracana podczas zapytań za pomocą indeksów pełnotekstowych
  • PROJECTION: Faza zwracana dla ograniczenia zwracanych pól

Zawartość executionStats

Poniższa zawartość jest zawartością zwracaną w trybie executionStats, pomijając informacje nieważne

{
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 5,  // Liczba zwróconych dokumentów
		"executionTimeMillis" : 0, // Czas wykonania
		"totalKeysExamined" : 0, // Ilość przeszukanych indeksów
		"totalDocsExamined" : 5, // Całkowita liczba przeszukanych dokumentów
		"executionStages" : {
			"stage" : "COLLS CAN", // Typ fazy, COLLSCAN oznacza przeszukiwanie całej tabeli
			"nReturned" : 5,
			"executionTimeMillisEstimate" : 0,
			"works" : 7,
			"advanced" : 5,
			"needTime" : 1,
			"needYield" : 0,
			"saveState" : 0,
			"restoreState" : 0,
			"isEOF" : 1,
			"direction" : "forward",
			"docsExamined" : 5
		}
	}
}

Pomysły na optymalizację zapytań

  • Stosuj indeksy jak najczęściej
  • Im mniej przeszukiwanych dokumentów, tym lepiej