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