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

Czy powinienem zaimplementować autoinkrementację w MongoDB?

Zdecydowanie nie zgadzam się z autorem wybranej odpowiedzi, że Brak identyfikatora auto-inkrementacji w MongoDB i są dobre powody . Nie znamy powodów, dla których 10gen nie zachęcał do korzystania z automatycznie zwiększanych identyfikatorów. To spekulacje. Myślę, że 10gen dokonał takiego wyboru, ponieważ po prostu łatwiej jest zapewnić unikalność 12-bajtowych identyfikatorów w środowisku klastrowym. Jest to domyślne rozwiązanie, które pasuje do większości nowicjuszy, dlatego zwiększa przyjęcie produktu, co jest dobre dla biznesu 10gen.

Teraz powiem wszystkim o moich doświadczeniach z ObjectIds w środowisku komercyjnym.

Buduję sieć społecznościową. Mamy około 6 milionów użytkowników, a każdy użytkownik ma około 20 znajomych.

Teraz wyobraź sobie, że mamy kolekcję, która przechowuje relacje między użytkownikami (kto podąża za kim). Wygląda tak

_id : ObjectId
user_id : ObjectId
followee_id : ObjectId

na którym mamy unikalny indeks złożony {user_id, followee_id} . Możemy oszacować rozmiar tego indeksu na 12*2*6M*20 =2GB. Teraz jest to indeks do szybkiego wyszukiwania osób, które śledzę. Do szybkiego wyszukiwania osób, które za mną podążają, potrzebuję indeksu odwrotnego. To kolejne 2 GB.

A to dopiero początek. Muszę wszędzie nosić te dokumenty. Mamy klaster aktywności, w którym przechowujemy Twój kanał informacyjny. To każde wydarzenie, które robisz Ty lub Twoi znajomi. Wyobraź sobie, ile zajmuje miejsca.

I w końcu jeden z naszych inżynierów podjął nieświadomą decyzję i postanowił przechowywać referencje jako ciągi reprezentujące ObjectId, co podwaja jego rozmiar.

Co się stanie, jeśli indeks nie zmieści się w pamięci RAM? Nic dobrego, mówi 10gen:

Gdy indeks jest zbyt duży, aby zmieścić się w pamięci RAM, MongoDB musi odczytać indeks z dysku, co jest znacznie wolniejszą operacją niż odczyt z pamięci RAM. Pamiętaj, że indeks mieści się w pamięci RAM, gdy serwer ma dostępną pamięć RAM dla indeksu w połączeniu z resztą zestawu roboczego.

Oznacza to, że odczyty są wolne. Rywalizacja o blokadę rośnie. Zapisy również stają się wolniejsze. Widząc rywalizację o blokadę w 80% nie jest już dla mnie szokiem.

Zanim się zorientujesz, masz klaster o pojemności 460 GB, który musisz podzielić na fragmenty i którym dość trudno jest manipulować.

Facebook używa 64-bitowej długości jako identyfikatora użytkownika :) Jest ku temu powód. Możesz generować kolejne identyfikatory

  • używając porady 10gen .
  • używanie mysql do przechowywania liczników (jeśli martwisz się o szybkość, spójrz na handlersocket )
  • korzystając z utworzonej przez siebie usługi generowania identyfikatorów lub używając czegoś takiego jak Płatek śniegu przez Twittera.

Oto moja ogólna rada dla wszystkich. Prosimy o jak najmniejsze dane. Kiedy dorośniesz, zaoszczędzisz wiele nieprzespanych nocy.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB elemMatch nie działa oczekiwano

  2. Opracuj schemat bazy danych dla powiadomień jak na Facebooku

  3. Mongoose dodaje atrybut wygasa dla określonego pola

  4. MongoDB $sum Operator potoku agregacji

  5. Próba znalezienia za pomocą $regex wielu pól jednocześnie w Mongodb