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

Przegląd narzędzia MongoDB Database Profiler

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.

    db.getProfilingLevel()
    Dane wyjściowe:
    0
  • Aby sprawdzić aktualny stan profilowania

    db.getProfilingStatus()
    Dane wyjściowe:
    { "was" : 0, "slowms" : 100 }
  • Aby ustawić poziom profilowania

    db.setProfilingLevel(1, 40)
    Dane wyjściowe:
    { "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 darmo

Przydatne zapytania do analizy wyników profilera

  1. 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();
  2. Znajdź wszystkie zapytania, których wykonanie trwa dłużej niż 30 milisekund

    db.system.profile.find({millis:{$gt:30}}).pretty()
  3. Znajdź 10 najwolniejszych zapytań agregujących / poleceń

    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
  4. Znajdź wszystkie operacje, dla których przeniesiono niektóre dokumenty

    db.system.profile.find({moved:true}).pretty()
  5. Znajdź zapytania, które wykonują duże skanowanie bazy danych

    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
  6. 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()
  7. 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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose limit/przesunięcie i zapytanie zliczania

  2. Sprawdź istnienie kolekcji w MongoDB

  3. Jak wykonać zapytanie NOT IN w Mongo?

  4. Wstaw słownik do MongoDB za pomocą sterownika c#

  5. Przewodnik po MongoDB z Javą