sql >> Databáze >  >> NoSQL >> MongoDB

Mám implementovat automatické zvyšování v MongoDB?

Silně nesouhlasím s autorem vybrané odpovědi, že Žádné automatické zvýšení id v MongoDB a existují dobré důvody . Neznáme důvody, proč 10gen nepodporoval používání automaticky inkrementovaných ID. Je to spekulace. Myslím, že 10gen udělal tuto volbu, protože je snazší zajistit jedinečnost 12bajtových ID v clusterovém prostředí. Je to výchozí řešení, které vyhovuje většině nováčků, a proto zvyšuje přijetí produktu, což je dobré pro podnikání 10gen.

Nyní mi dovolte, abych všem řekl o své zkušenosti s ObjectId v komerčním prostředí.

Buduji sociální síť. Máme zhruba 6 milionů uživatelů a každý uživatel má zhruba 20 přátel.

Nyní si představte, že máme kolekci, která ukládá vztahy mezi uživateli (kdo koho sleduje). Vypadá to takto

_id : ObjectId
user_id : ObjectId
followee_id : ObjectId

na kterém máme jedinečný složený index {user_id, followee_id} . Velikost tohoto indexu můžeme odhadnout na 12*2*6M*20 =2GB. To je index pro rychlé vyhledání lidí, které sleduji. Pro rychlé vyhledání lidí, kteří mě sledují, potřebuji reverzní index. To jsou další 2 GB.

A to je jen začátek. Tyto průkazy musím nosit všude. Máme cluster aktivit, kde ukládáme váš informační kanál. To je každá akce, kterou děláte vy nebo vaši přátelé. Představte si, kolik místa to zabere.

A nakonec jeden z našich inženýrů učinil nevědomé rozhodnutí a rozhodl se uložit odkazy jako řetězce, které představují ObjectId, což zdvojnásobí jeho velikost.

Co se stane, když se index nevejde do paměti RAM? Nic dobrého, říká 10gen:

Když je index příliš velký, aby se vešel do paměti RAM, musí MongoDB načíst index z disku, což je mnohem pomalejší operace než čtení z paměti RAM. Mějte na paměti, že index se vejde do paměti RAM, pokud má váš server k dispozici RAM pro index v kombinaci se zbytkem pracovní sady.

To znamená, že čtení je pomalé. Spor o zámek stoupá. Zápis je také pomalejší. Vidět spory o zámek na 80 % už pro mě není šok.

Než se nadějete, skončili jste u 460GB clusteru, který musíte rozdělit na úlomky a se kterým je docela těžké manipulovat.

Facebook používá jako ID uživatele 64bitovou délku :) Má to svůj důvod. Můžete vygenerovat sekvenční ID

  • pomocí rada 10gen .
  • používání mysql jako úložiště počítadel (pokud vás zajímá rychlost, podívejte se na handlersocket )
  • pomocí služby generování ID, kterou jste vytvořili, nebo pomocí něčeho jako Sněhová vločka prostřednictvím Twitteru.

Takže zde je moje obecná rada pro všechny. Udělejte prosím svá data co nejmenší. Až vyrostete, ušetří vám spoustu bezesných nocí.



  1. Existuje analog MGET pro hashe Redis?

  2. Redis filtrovat podle rozsahu, seřadit a vrátit nejprve 10

  3. Dlouhý akumulátor místo Double ve funkci MongoDB group().

  4. REAGOVAT požadavek na načtení příspěvku