Każdy rodzaj bazy danych napotyka problemy z wydajnością, gdy ilość danych rośnie. Proste kroki, takie jak przepisywanie problematycznych zapytań lub analiza/optymalizacja schematu bazy danych, mogą drastycznie poprawić wydajność bazy danych. MongoDB zapewnia kilka doskonałych funkcji, które czynią ten proces bardzo łatwym dla administratorów baz danych. Na przykład Query Profiler, Mongostat, Mongotop, dobra obsługa logowania itp.
W większości przypadków to system bazy danych decyduje o tym, jak zostanie wykonane zapytanie. Użytkownik podaje tylko szczegółowe informacje o żądanym wyniku za pomocą języka zapytań. W tym artykule omówimy, w jaki sposób możemy użyć programu do profilowania zapytań MongoDB, aby znaleźć powolne i wymagające dużej ilości zasobów zapytania. MongoDB Profiler to wbudowane narzędzie, które zapewnia rzeczywisty wgląd na poziomie zapytania. Pozwala na analizę wszystkich zapytań uruchamianych przez system bazy danych.
Włączanie/konfigurowanie narzędzia MongoDB Profiler
Ogólnie rzecz biorąc, profiler przechowuje wszystkie dane w kolekcji system.profile, które można odpytywać jak każdą inną normalną kolekcję MongoDB. Profiler ma 3 poziomy profilowania. Domyślnie poziom profilera jest ustawiony na 0 dla dowolnej bazy danych.
Poziom 0 | Profiler nie będzie rejestrować żadnych danych |
Poziom 1 | Profiler będzie rejestrować tylko powolne operacje powyżej pewnego progu |
Poziom 2 | Profiler zarejestruje wszystkie operacje |
Możesz uruchomić następujące polecenia, aby uzyskać informacje o profilerze.
-
Aby uzyskać aktualny poziom profilowania.
Dane wyjściowe:db.getProfilingLevel()
0
-
Aby sprawdzić aktualny stan profilowania
Dane wyjściowe:db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
Aby ustawić poziom profilowania
Dane wyjściowe:db.setProfilingLevel(1, 40)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
MongoDB wydrukuje stary poziom profilowania i zwróci OK, co oznacza, że poziom profilowania jest teraz ustawiony na 1.
Slowms to wartość progowa dla profilera, co oznacza, że profiler będzie rejestrował wszystkie zapytania, których wykonanie zajmuje więcej czasu niż wartość progowa.
Zrozumienie danych wyjściowych profilera
Uruchom to polecenie, aby pobrać 1 dokument z kolekcji system.profile.
db.system.profile.find().limit(1).pretty()
Wyjście:
{
"op" : "query",
"ns" : "mydb.Log",
"query" : {
"find" : "Log",
"filter" : {
"EMP_ID" : "01778"
}
},
"keysExamined" : 0,
"docsExamined" : 90022,
"cursorExhausted" : true,
"keyUpdates" : 0,
"writeConflicts" : 0,
"numYield" : 703,
"locks" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(1408)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(704)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(704)
}
}
},
"nreturned" : 60,
"responseLength" : 17676,
"protocol" : "op_command",
"millis" : 40,
"execStats" : {
"stage" : "COLLSCAN",
"filter" : {
"EMP_ID" : {
"$eq" : "01778"
}
},
"nReturned" : 60,
"executionTimeMillisEstimate" : 30,
"works" : 90024,
"advanced" : 60,
"needTime" : 89963,
"needYield" : 0,
"saveState" : 703,
"restoreState" : 703,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 90022
},
"ts" : ISODate("2018-09-09T07:24:56.487Z"),
"client" : "127.0.0.1",
"allUsers" : [ ],
"user" : ""
}
To jest jeden dokument z kolekcji system.profile. Widzimy, że zawiera wiele przydatnych dla nas informacji. Rozumiemy niektóre przydatne pola z tego dokumentu.
- Pole operacyjne przechowuje typ operacji.
- Pole Ns przechowuje docelową bazę danych i nazwę kolekcji
- Pole Zapytanie przechowuje informacje o zapytaniu i wyniku. Wynik zostanie obcięty, jeśli rozmiar dokumentu będzie większy niż 50 KB
- keysExamined przechowuje liczbę kluczy indeksu sprawdzanych przez DB w celu wykonania zapytania
- docsExamined przechowuje całkowitą liczbę dokumentów zbadanych przez DB
- Nreturned przechowuje liczbę dokumentów zwróconych przez zapytanie
- Millis zawiera rzeczywisty czas w milisekundach potrzebny do wykonania tego zapytania
- Ts przechowuje znacznik czasu zapytania
Możemy uzyskać wiele informacji o tym, jak operacja zapytania została wykonana przez system bazy danych, badając te pola i wykorzystując je do optymalizacji wydajności bazy danych. Na przykład, jeśli wartość keysExamined jest większa niż wartość „nreturns”, oznacza to, że DB skanuje wiele indeksów, aby uzyskać wynik, który nigdy nie jest dobrym znakiem. Powinieneś więc odpowiednio dostosować indeksy bazy danych.
Kilkadziesiąt — Zostań administratorem baz danych MongoDB — wprowadzenie MongoDB do produkcjiDowiedz się, co trzeba wiedzieć, aby wdrażać, monitorować, zarządzać i skalować MongoDB. Pobierz za darmoPrzydatne zapytania do analizy wyników profilera
-
Najbardziej użytecznym zapytaniem jest sortowanie wszystkich dokumentów według milisekund, aby uzyskać 10 najwolniejszych zapytań.
db.system.profile.find().sort({millis:-1}).limit(10).pretty();
-
Znajdź wszystkie zapytania, których wykonanie trwa dłużej niż 30 milisekund
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Znajdź 10 najwolniejszych zapytań agregujących / poleceń
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Znajdź wszystkie operacje, dla których przeniesiono niektóre dokumenty
db.system.profile.find({moved:true}).pretty()
-
Znajdź zapytania, które wykonują duże skanowanie bazy danych
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
Znajdź maksymalny i średni czas każdego rodzaju operacji za pomocą agregacji
db.system.profile.aggregate( { $group : { _id :"$op", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}).pretty()
-
Znajdź maksymalny i średni czas potrzebny na zapytania w każdej bazie danych za pomocą agregacji
db.system.profile.aggregate( { $group : { _id :"$ns", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}.pretty()
Wniosek
MongoDB Profiler to bardzo przydatne narzędzie, które pozwala uzyskać wgląd w to, w jaki sposób baza danych wykonuje zapytania/polecenia. Jeśli planujesz używać profilera w środowisku produkcyjnym, powinieneś przeprowadzić odpowiednie testy, ponieważ może to mieć wpływ na przepustowość bazy danych, zwłaszcza gdy rejestrujesz wszystkie zapytania, tj. Poziom profilowania jest ustawiony na 2. Innym aspektem korzystania z tego narzędzia jest określenie, co wolne środki. Musisz zdecydować, że wszystkie zapytania można uznać za powolne. Na tej podstawie możesz ustawić minimalny próg rejestrowania zapytań. Zmniejszy to wpływ używania tego narzędzia na wydajność bazy danych