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.