Pozwól, że dam ci kilka wskazówek opartych na mojej globalnej wiedzy i doświadczeniu:
Użyj krótszych nazw pól
MongoDB przechowuje ten sam klucz dla każdego dokumentu. To powtórzenie powoduje zwiększenie miejsca na dysku. Może to mieć pewne problemy z wydajnością w przypadku bardzo dużej bazy danych, takiej jak Twoja.
Plusy:
- Mniejszy rozmiar dokumentów, więc mniej miejsca na dysku
- Więcej dokumentów do umieszczenia w pamięci RAM (więcej pamięci podręcznej)
- W niektórych scenariuszach rozmiar indeksów do będzie mniejszy
Minusy:
- Mniej czytelne nazwy
Optymalizacja według rozmiaru indeksu
Im mniejszy jest rozmiar indeksu, tym bardziej mieści się w pamięci RAM i mniej się dzieje. Rozważmy na przykład skrót SHA1 dla zatwierdzeń git. Zatwierdzenie git jest wielokrotnie reprezentowane przez pierwsze 5-6 znaków. Następnie po prostu zapisz 5-6 znaków zamiast całego skrótu.
Zrozum współczynnik wypełnienia
W przypadku aktualizacji zachodzących w dokumencie, powodujących kosztowne przenoszenie dokumentów. Przeniesienie tego dokumentu powoduje usunięcie starego dokumentu i aktualizację go do nowej pustej lokalizacji oraz aktualizację indeksów, która jest kosztowna.
Musimy się upewnić, że dokument się nie przesunie, jeśli nastąpi aktualizacja. Dla każdej kolekcji zaangażowany jest współczynnik wypełnienia, który podczas wstawiania dokumentu mówi, ile dodatkowej przestrzeni należy przydzielić poza rzeczywistym rozmiarem dokumentu.
Możesz zobaczyć współczynnik wypełnienia kolekcji za pomocą:
db.collection.stats().paddingFactor
Dodaj dopełnienie ręcznie
W twoim przypadku na pewno zaczniesz od małego dokumentu, który będzie rósł. Aktualizacja dokumentu po pewnym czasie spowoduje wiele ruchów dokumentu. Więc lepiej dodaj dopełnienie do dokumentu. Niestety nie ma łatwego sposobu na dodanie wyściółki. Możemy to zrobić, dodając losowe bajty do jakiegoś klucza podczas wstawiania, a następnie usuwając ten klucz w następnym zapytaniu aktualizacyjnym.
Na koniec, jeśli masz pewność, że niektóre klucze pojawią się w dokumentach w przyszłości, przydziel je wstępnie z pewnymi wartościami domyślnymi, aby dalsze aktualizacje nie powodowały wzrostu rozmiaru dokumentu powodującego przenoszenie dokumentów.
Możesz uzyskać szczegółowe informacje na temat zapytania powodującego przeniesienie dokumentu:
db.system.profile.find({ moved: { $exists : true } })
Duża liczba kolekcji VS duża liczba dokumentów w kilku kolekcjach
Schemat to coś, co zależy od wymagań aplikacji. Jeśli istnieje ogromny zbiór, w którym odpytujemy tylko ostatnie N dni danych, możemy opcjonalnie wybrać osobny zbiór, a stare dane można bezpiecznie archiwizować. Zapewni to prawidłowe buforowanie w pamięci RAM.
Każda stworzona kolekcja wiąże się z kosztem przewyższającym koszt stworzenia kolekcji. Każda z kolekcji ma minimalny rozmiar, który wynosi kilka KB + jeden indeks (8 KB). Każda kolekcja ma powiązaną przestrzeń nazw, domyślnie mamy kilka przestrzeni nazw 24K. Na przykład posiadanie kolekcji na użytkownika jest złym wyborem, ponieważ nie jest skalowalna. Po pewnym czasie Mongo nie pozwoli nam tworzyć nowych kolekcji indeksów.
Ogólnie rzecz biorąc, posiadanie wielu kolekcji nie powoduje znaczącej utraty wydajności. Na przykład możemy wybrać jedną kolekcję na miesiąc, jeśli wiemy, że zawsze wysyłamy zapytania na podstawie miesięcy.
Denormalizacja danych
Zawsze zaleca się przechowywanie wszystkich powiązanych danych dla zapytania lub sekwencji zapytań w tej samej lokalizacji na dysku. Musisz coś powielić informacje w różnych dokumentach. Na przykład w poście na blogu chcesz przechowywać komentarze do posta w dokumencie posta.
Plusy:
- rozmiar indeksu będzie bardzo mniejszy, ponieważ liczba wpisów indeksu będzie mniejsza
- zapytanie będzie bardzo szybkie, co obejmuje pobranie wszystkich niezbędnych szczegółów
- rozmiar dokumentu będzie porównywalny z rozmiarem strony, co oznacza, że gdy przenosimy te dane do pamięci RAM, przez większość czasu nie przenosimy innych danych na stronę
- przeniesienie dokumentu zapewni, że uwolnimy stronę, a nie mały fragment strony, który nie może być użyty w dalszych wstawkach
Ograniczone kolekcje
Kolekcja ograniczona zachowuje się jak bufory cykliczne. Są to specjalne kolekcje o stałym rozmiarze. Te zbiory mogą odbierać bardzo szybkie zapisy i odczyty sekwencyjne. Będąc stałym rozmiarem, po zapełnieniu przydzielonego miejsca, nowe dokumenty są zapisywane przez usunięcie starszych. Jednak aktualizacje dokumentu są dozwolone tylko wtedy, gdy zaktualizowany dokument pasuje do oryginalnego rozmiaru dokumentu (baw się dopełnieniem, aby uzyskać większą elastyczność).