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

Aktualizace velkého počtu záznamů v kolekci

Dovolte mi, abych vám dal několik tipů na základě mých globálních znalostí a zkušeností:

Používejte kratší názvy polí

MongoDB ukládá stejný klíč pro každý dokument. Toto opakování způsobí zvětšení místa na disku. To může mít problém s výkonem u velmi velké databáze, jako je ta vaše.

Výhody:

  • Menší velikost dokumentů, tím méně místa na disku
  • Více dokumentů, které se vejdou do paměti RAM (více mezipaměti)
  • Velikost indexů do bude v některých případech menší

Nevýhody:

  • Méně čitelné názvy

Optimalizace podle velikosti indexu

Čím menší je velikost indexu, tím více se vejde do paměti RAM a méně dojde k chybě indexu. Zvažte například hash SHA1 pro odevzdání git. Git commit je mnohokrát reprezentován prvními 5-6 znaky. Pak jednoduše uložte 5-6 znaků místo všech hash.

Pochopte faktor vyplnění

U aktualizací, které v dokumentu probíhají, což způsobuje nákladný přesun dokumentu. Tento přesun dokumentu způsobí smazání starého dokumentu a jeho aktualizaci na nové prázdné místo a aktualizaci indexů, což je nákladné.

Musíme zajistit, aby se dokument nepohnul, pokud dojde k nějaké aktualizaci. Pro každou kolekci je zahrnut faktor vyplnění, který během vkládání dokumentu říká, kolik místa navíc má být přiděleno kromě skutečné velikosti dokumentu.

Faktor vyplnění sbírky můžete zobrazit pomocí:

db.collection.stats().paddingFactor

Přidat výplň ručně

Ve vašem případě jste si jisti, že začnete s malým dokumentem, který poroste. Aktualizace dokumentu po chvíli způsobí několik přesunů dokumentu. Proto je lepší přidat výplň dokumentu. Bohužel neexistuje jednoduchý způsob, jak přidat vycpávku. Můžeme to udělat přidáním několika náhodných bajtů k některému klíči při vkládání a poté odstraněním tohoto klíče v příštím aktualizačním dotazu.

A konečně, pokud jste si jisti, že některé klíče přijdou do dokumentů v budoucnu, pak těmto klíčům předem přidělte nějaké výchozí hodnoty, aby další aktualizace nezpůsobily nárůst velikosti dokumentu způsobující přesuny dokumentu.

Podrobnosti o dotazu způsobujícím přesun dokumentu můžete získat:

db.system.profile.find({ moved: { $exists : true } })

Velký počet sbírek VS velký počet dokumentů v málo sbírkách

Schéma je něco, co závisí na požadavcích aplikace. Pokud existuje velká sbírka, ve které se dotazujeme pouze na data za posledních N dní, můžeme volitelně zvolit oddělený sběr a stará data lze bezpečně archivovat. Tím zajistíte, že ukládání do mezipaměti v paměti RAM probíhá správně.

Každá vytvořená sbírka vyžaduje náklady, které jsou vyšší než náklady na vytvoření sbírky. Každá kolekce má minimální velikost, což je několik KB + jeden index (8 KB). Každá kolekce má přidružený jmenný prostor, ve výchozím nastavení máme nějakých 24 kB jmenných prostorů. Například mít sbírku na uživatele je špatná volba, protože není škálovatelná. Po určité době nám Mongo nedovolí vytvářet nové kolekce indexů.

Obecně platí, že mnoho sbírek nemá žádné významné snížení výkonu. Můžeme se například rozhodnout mít jednu sbírku za měsíc, pokud víme, že se vždy dotazujeme na měsíce.

Denormalizace dat

Vždy se doporučuje uchovávat všechna související data pro dotaz nebo sekvenci dotazů na stejném místě na disku. Něco potřebujete duplikovat informace v různých dokumentech. Například v příspěvku na blogu budete chtít uložit komentáře příspěvku v dokumentu příspěvku.

Výhody:

  • velikost indexu bude mnohem menší, protože počet položek indexu bude menší
  • dotaz bude velmi rychlý, což zahrnuje načtení všech nezbytných podrobností
  • velikost dokumentu bude srovnatelná s velikostí stránky, což znamená, že když tato data přeneseme do paměti RAM, většinou na stránku jiná data nepřenášíme
  • přesunutí dokumentu zajistí, že uvolníme stránku, nikoli malý malý kousek na stránce, který nelze použít v dalších vkládáních

Omezené sbírky

Omezená kolekce se chová jako kruhové vyrovnávací paměti. Jsou speciálním typem kolekcí s pevnou velikostí. Tyto kolekce mohou přijímat velmi vysokou rychlost zápisu a sekvenčního čtení. Vzhledem k pevné velikosti se po zaplnění přiděleného místa nové dokumenty zapisují odstraněním starších. Aktualizace dokumentu jsou však povoleny pouze v případě, že aktualizovaný dokument odpovídá velikosti původního dokumentu (pro větší flexibilitu si pohrajte s odsazením).




  1. Porozumění Meteor Publish / Subscribe

  2. Mongodb dotaz založený na položce na konkrétní pozici v poli

  3. Jak vytvořit DB pro kontejner MongoDB při spuštění?

  4. Jak nastavit _id na dokument db v Mongoose?