2016-01-31 22 views
8

Ostatnio zauważyłem ogromną różnicę w wydajności między wielokrotnymi wersjami (poprzez bulk operations) a wstawką (wieloma dokumentami). Chciałbym wiedzieć, czy jestem właściwie na to:MongoDB: Update/Upsert vs Insert

  • upsert/poprawki będzie jak find() i update() tak to robi 2 rzeczy czytać i pisać
  • Włóż po prostu napisać, więc jej dużo szybciej

Tak więc różnica w wydajności?

Jeśli tak jest, to zastanawiam się, czy potrzebuję dużo zapisów regularnie, zamiast aktualizować dokument, piszę nowy dokument z polem createdOn. Następnie, aby zapytać, po prostu zapytam o dokumenty, posortowane według createdOn DESC. Zastanawiam się, czy to jest dobra metoda? Czy jest jakiś lepszy sposób?

  • Zastanawiam się, czy mam indeks na kolekcji, czy może przyspieszyć aktualizację? Ale czy ten indeks nie spowolni zapisu?
  • Przy drugim sposobie, w którym wkładam tylko wkładki, zwolni to, że mam zbyt wiele dokumentów? Czy to jest praktyczne (przyspieszyć pisanie)?
  • Próbowałem również zwiększyć rozmiar puli połączeń. Nie jestem pewien, co jest optymalne, ale próbowałem 20 i widzę, że potrafię obsłużyć około 20 zapytań na sekundę przez mongostat. Spodziewałem się, że będzie o wiele wyższa.
+0

Ogólnie rzecz biorąc, indeksy służą tylko do przyspieszania odczytów. Nie pisze. –

+0

=> Tworzenie różnych dokumentów za każdym razem: Będzie to dobre rozwiązanie w zależności od częstotliwości dodawania dokumentu. Jeśli liczba dokumentów będzie ogromna w bardzo krótszym czasie, zapytanie wyszukiwania będzie wolniejsze. Nie użyję tego bca Mam dokumenty zamówienia w każdym zapytaniu ... Nawet muszę dostać jeden dokument. –

Odpowiedz

2

ja nie znalazłem „urzędnik” wyjaśnienie, w jaki sposób upsert pracuje w MongoDB, ale tak to jest bezpiecznie założyć, że ponieważ operacja ma na celu aktualizację istniejących dokumentów, a jedynie dodać dokument, gdy dokument z podanymi kryteriami nie można znaleźć.

Jeśli dodasz indeks, wtedy upsert może stać się szybszy: po tym, jak indeks jest używany do "znalezienia" dokumentu. Zastrzeżenie dotyczy pola (ów), na którym działa indeks i pól, które aktualizujesz. Jeśli zaktualizowana część jest częścią indeksu, wpłynie to na wydajność aktualizacji dokumentu. Jeśli zaktualizowana część nie jest częścią indeksu, nie poniesiesz kary za pisanie w istniejącym dokumencie. Jeśli dokument zostanie dodany, będzie to miało niewielki wpływ na wydajność, ponieważ zbiór indeksu jest aktualizowany. Ale wciąż: samo dodanie dokumentu pozostanie szybsze.

Dlatego jeśli w scenariuszu wiesz, że nie chcesz aktualizować dokumentów, to wstawki są zazwyczaj szybsze. Jeśli chcesz się upewnić, że nie dodasz tego samego dokumentu dwa razy, możesz również dodać unikalny indeks. Wtedy wkładka po prostu zawiedzie.

W sumie zależy to od konkretnego scenariusza, ale na podstawie informacji, które mogę wyciągnąć z twojego pytania, myślę, że najlepszą opcją jest po prostu wstawienie dokumentów. Ponieważ wydajesz się upewnić, że pole "createdon" sprawia, że ​​dokumenty są unikalne w twoim scenariuszu, musisz się tylko martwić o indeksy używane w twoich scenariuszach odczytu.

Niektóre dodatkowo informacji można znaleźć na stronie Mongo: https://docs.mongodb.com/v3.4/core/write-performance/

Aby uzyskać więcej informacji na temat projektowania swoich (odczyt) indeksy, dość dobre wytłumaczenie na znalezienie się, czy indeksy dodać coś do planów zapytanie można znaleźć tutaj: https://docs.mongodb.com/v3.4/tutorial/analyze-query-plan/

Mam nadzieję, że to pomoże.

10

Jeśli twój dokument wstawiający, Mongodb musi sprawdzić, czy dokument z tym samym objectId istnieje, czy nie. Jeśli istnieje, nie można wstawić dokumentu.

Ten sam przypadek dotyczy aktualizacji. Musi sprawdzić, czy dokument istnieje, czy nie. Inna aktualizacja nie może zostać wykonana. Przypadek, w którym kwerenda aktualizacji zostanie zwolniona, jeśli nie znajdziesz dokumentu na podstawie pola ObjectId/Indexed.

Inna wydajność do wstawiania/aktualizacji dokumentu powinna być taka sama.

Np .....

Więc Insert może być tak // (Szybka)

  1. (Sprawdzenie dokumentów -> Not Found -> Wstaw nowy dokument) Else
  2. (sprawdź, czy dokument -> Różne -> nie można włożona)

i aktualizować z upsert (objectID dostępny) // (Szybka)

  1. (Sprawdzanie dokumentu -> Not Found -> Wstaw nowy dokument) Else
  2. (Sprawdzanie dokumentu -> Różne -> Aktualizacja dokumentu)

lub zaktualizować z upsert (bez objectID) // jest to powolny

  1. (Znajdź objectID'S (wolno) -> Not Found -> Wstaw nowy dokument) Else
  2. (Znajdź objectId'S (wolne) -> Różne -> Aktualizacja dokumentów)