Udostępnij za pośrednictwem


Optymalizacja wydajności zapisu w Azure Cosmos DB for MongoDB

DOTYCZY: MongoDB

Optymalizacja wydajności zapisu pomaga jak najlepiej wykorzystać nieograniczoną skalę usługi Azure Cosmos DB dla bazy danych MongoDB. W przeciwieństwie do innych zarządzanych usług MongoDB interfejs API dla bazy danych MongoDB automatycznie i w sposób przezroczysty fragmentuje kolekcje (w przypadku używania kolekcji podzielonych na fragmenty) w celu skalowania w nieskończoność.

Sposób zapisywania danych musi być świadomy tego przez równoległe i rozłożone dane między fragmentami, aby uzyskać najwięcej zapisów z baz danych i kolekcji. W tym artykule opisano najlepsze rozwiązania dotyczące optymalizowania wydajności zapisu.

Rozłożenie obciążenia na fragmenty

Podczas zapisywania danych w podzielonym na fragmenty interfejsie API dla kolekcji bazy danych MongoDB dane są dzielone (podzielone na fragmenty) na małe wycinki i są zapisywane w poszczególnych fragmentach na podstawie wartości pola klucza fragmentu. Każdy fragment można traktować jako małą część maszyny wirtualnej, która przechowuje tylko dokumenty zawierające jedną unikatową wartość klucza fragmentu.

Jeśli aplikacja zapisuje ogromną ilość danych w jednym fragmentzie, nie będzie to wydajne, ponieważ aplikacja będzie maksymalnie stosować przepływność tylko jednego fragmentu zamiast rozkładać obciążenie we wszystkich fragmentach. Obciążenie zapisu będzie równomiernie rozłożone w całej kolekcji, pisząc równolegle do wielu dokumentów z unikatowymi wartościami klucza fragmentu.

Przykładem może być aplikacja wykazu produktów, która jest podzielony na fragmenty w polu kategorii. Zamiast zapisywać w jednej kategorii (fragment) naraz, lepiej jest zapisywać wszystkie kategorie jednocześnie, aby uzyskać maksymalną przepływność zapisu.

Zmniejsz liczbę indeksów

Indeksowanie to świetna funkcja, która znacząco skraca czas wykonywania zapytań o dane. W przypadku najbardziej elastycznego środowiska zapytań interfejs API dla bazy danych MongoDB domyślnie umożliwia tworzenie zapytań względem wszystkich pól, które są szybkie. Jednak wszystkie indeksy, które zawierają indeksy wieloznaczne, powodują dodatkowe obciążenie podczas zapisywania danych, ponieważ zapisy zmieniają kolekcję i indeksy.

Zmniejszenie liczby indeksów tylko do indeksów potrzebnych do obsługi zapytań sprawi, że zapisy będą szybsze i tańsze. Ogólnie rzecz biorąc, zalecamy następujące kwestie:

  • Każde pole, na którym filtrujesz, powinno mieć odpowiedni indeks pojedynczego pola. Ta opcja umożliwia również filtrowanie wielu pól.
  • Każda grupa pól, które sortujesz, powinna mieć indeks złożony dla tej grupy.

Ustaw wartość false w sterownikach bazy danych MongoDB

Domyślnie sterowniki bazy danych MongoDB ustawiają uporządkowaną opcję na wartość "true" podczas zapisywania danych, która zapisuje każdy dokument w kolejności jeden po drugim. Ta opcja zmniejsza wydajność zapisu, ponieważ każde żądanie zapisu musi czekać na ukończenie poprzedniego żądania. Podczas zapisywania danych ustaw tę opcję na wartość false, aby zwiększyć wydajność.

db.collection.insertMany(
   [ <doc1> , <doc2>, ... ],
   {
      ordered: false
   }
)

Dostrajanie optymalnego rozmiaru partii i liczby wątków

Równoległość operacji zapisu w wielu wątkach/procesach jest kluczem do skalowania zapisów. Interfejs API dla bazy danych MongoDB akceptuje zapisy w partiach maksymalnie 1000 dokumentów dla każdego procesu/wątku.

Jeśli piszesz więcej niż 1000 dokumentów w czasie na proces/wątek, funkcje klienta, takie jak insertMany() powinny być ograniczone do około 1000 dokumentów. W przeciwnym razie klient będzie czekał na zatwierdzenie każdej partii przed przejściem do następnej partii. W niektórych przypadkach podzielenie partii z mniejszą lub nieco większą niż 1000 dokumentami będzie szybsze.

Następne kroki