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

Potok zbiorczy MongoDB powoli po pierwszym kroku dopasowania

ODPOWIEDŹ 2019

Ta odpowiedź dotyczy MongoDB 4.2

Po przeczytaniu pytania i dyskusji między wami uważam, że problem został rozwiązany, ale nadal optymalizacja jest powszechnym problemem dla wszystkich, którzy korzystają z MongoDB.

Zetknąłem się z tym samym problemem, a oto wskazówki dotyczące optymalizacji zapytań.

Popraw mnie, jeśli się mylę :)

1. Dodaj indeks do kolekcji

Indeksy odgrywają istotną rolę w szybkim uruchamianiu zapytań, ponieważ indeksy to struktury danych, które mogą przechowywać zestaw danych kolekcji w formie łatwej do przechodzenia. Zapytania są efektywnie wykonywane za pomocą indeksów w MongoDB.

W zależności od potrzeb możesz tworzyć różne typy indeksów. Dowiedz się więcej o indeksach tutaj, w oficjalnej dokumentacji MongoDB.

2. Optymalizacja potoku

  • Zawsze użyj $match przed $projektem , ponieważ filtry usuwają dodatkowe dokumenty i pola z następnego etapu.
  • Zawsze pamiętaj, indeksy są używane przez $match i $sort . Spróbuj więc dodać indeks do pól, według których będziesz sortować lub filtrować dokumenty.
  • Spróbuj zachować tę sekwencję w zapytaniu, użyj $sort przed $limit jak $sort + $limit + $pomiń. Ponieważ $sort korzysta z indeksu i pozwala MongoDB wybrać wymagany plan zapytania podczas wykonywania zapytania.
  • Zawsze użyj limitu $ przed $pomiń aby pominięcie zostało zastosowane do ograniczenia dokumentów.
  • Użyj $projektu aby zwrócić tylko niezbędne dane w następnym etapie.
  • Zawsze utwórz indeks dla atrybutów outsideField w $lookup . Ponadto, ponieważ lookup tworzy tablicę, zwykle rozwijamy ją w następnym etapie. Tak więc, zamiast rozwijać go w następnym etapie, rozwiń go w wyszukiwarce, tak jak:

    {
    $lookup: {
        from: "Collection",
        as: "resultingArrays",
        localField: "x",
        foreignField: "y",
        unwinding: { preserveNullAndEmptyArrays: false }
    

    }}

  • Użyj allowDiskUse w agregacji za pomocą operacji agregacji można zapisywać dane do podkatalogu _tmp w katalogu Ścieżka bazy danych. Służy do wykonywania dużych zapytań w katalogu tymczasowym. Na przykład:

     db.orders.aggregate(
     [
            { $match: { status: "A" } },
            { $group: { _id: "$uid", total: { $sum: 1 } } },
            { $sort: { total: -1 } }
     ],
     {
            allowDiskUse: true
     },
     )
    

3. Odbuduj indeksy

Jeśli często tworzysz i usuwasz indeksy, odbuduj je. Pomaga MongoDB odświeżyć wcześniej zapisany plan zapytań, pamięć podręczną, która wciąż przejmuje wymagany plan zapytań, uwierz mi, ten problem jest do bani :(

4. Usuń niechciane indeksy

Zbyt wiele indeksów zajmuje zbyt dużo czasu podczas operacji tworzenia, aktualizacji i usuwania, ponieważ muszą one utworzyć indeks wraz ze swoimi zadaniami. Tak więc usunięcie ich bardzo pomaga.

5. Ograniczanie dokumentów

W rzeczywistym scenariuszu pobranie pełnych danych znajdujących się w bazie danych nie pomaga. Ponadto albo nie możesz go wyświetlić, albo użytkownik nie może odczytać pełnych pobranych danych. Tak więc zamiast pobierać pełne dane, pobieraj dane porcjami, co pomaga zarówno Tobie, jak i Twojemu klientowi w oglądaniu tych danych.

I wreszcie obserwowanie, jaki plan wykonania jest wybrany przez MongoDB, pomaga w ustaleniu głównego problemu. Tak więc $explain pomoże ci to rozwiązać.

Mam nadzieję, że to podsumowanie pomoże wam, nie wahajcie się zasugerować nowych punktów, jeśli jakieś przegapiłem. Dodam je też.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak mogę dodać dwukolumnowy unikalny identyfikator do mongodb w aplikacji meteor?

  2. Konwersja dokumentów BSON do JSON w Javie

  3. Uzyskiwanie listy unikalnych obiektów osadzonych/zagnieżdżonych w dokumencie MongoDB

  4. Doskonalenie sztuki automatyzacji i zarządzania najpopularniejszymi bazami danych typu open source:2017 @ Severalnines

  5. Pierwsze kroki z MongoDB i Mongoose