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

mongodb indexy pokrývající chybějící hodnoty

Existují dvě důležité funkce indexu, které umožňují rychlé vyhledávání (ve srovnání s prováděním skenování kolekce):

  • Řazení hodnot
  • Kompaktnost indexovaných hodnot

Pokud máte hodnoty a a b , můžete říci, že a je před b , lexikograficky. Pokud máte dokumenty {a: 2, b: 5} a {b: 4, a: 3} , neexistuje jediné řazení těchto dokumentů, které by uspokojilo typické dotazy. Pokud například chcete všechny a hodnoty seřazené pak můžete očekávat 2, 3 , ale pokud chcete b hodnoty, které můžete očekávat 4, 5 - vyžadující obrácení pořadí dokumentů.

Když databáze ukládá index na disk, hodnoty jsou uloženy v pořadí indexů (ať už to může být pro konkrétní index cokoli, například řazení to ovlivňuje). Obecně neexistuje jediné uspořádání, které by bylo použitelné pro sběrné dokumenty jako celek, proto jsou sběrné dokumenty neuspořádané.

Když se dotazujete podle indexu, vezmete prohledanou hodnotu a v podstatě provedete binární vyhledávání pomocí indexu, protože data v indexu jsou setříděna.

Druhým důvodem pro použití indexu je, že pokud skenujete kolekci, pro každý dokument je obvykle nutné celý dokument načíst z disku a přeskočit. Pokud máte sbírku 100 GB a provádíte skenování, možná budete muset přeskočit více než 100 GB dat. Pokud má stejná kolekce v některém poli index o velikosti 100 MB (protože index ukládá pouze hodnoty v tomto poli a nikoli hodnotu dat celého dokumentu) a databáze provede úplné skenování indexu, musí projít pouze 100 MB dat. data.

Nyní k vaší otázce týkající se ukládání nedostatku hodnot v indexu.

Z hlediska indexu je „nedostatek hodnoty“ v různých dokumentech stejnou hodnotou. Ztratíte možnost provádět binární vyhledávání, když jsou všechny vaše hodnoty identické. Pokud tedy hledáte dokument s „nedostatečnou hodnotou“, index vám vrátí všechny dokumenty ve sbírce, které postrádají hodnotu, a pak je musíte stejně prohledat, abyste mohli filtrovat podle jakýchkoli dalších podmínek. mít. Protože to obecně způsobuje špatnou selektivitu, databáze se neobtěžují indexy a v první řadě provádějí skenování kolekcí.

A s největší pravděpodobností chcete z dotazu vyjmout některá další pole, nikoli pole, které nemá hodnotu. Nyní tedy chcete, aby index ukládal kompletní dokumenty, čímž překonáte myšlenku kompaktnosti.




  1. Výjimka ve vláknu monitoru při připojování k serveru localhost:27017 při přístupu k MongoDB pomocí Java

  2. Jak změnit dílčí dokument po nalezení pomocí mongoose

  3. Jak převést seznam casbah mongodb na json ve scala / play

  4. Návrh schématu Mongodb