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

Víceklíčové indexy MongoDB a hranice průniků indexů

MongoDB má skvělou podporu pro pole a poskytuje velkou flexibilitu v režimu dokumentu. Můžete například vkládat pole do dokumentů a také vkládat dokumenty do polí atd. Práce s poli má však v MongoDB řadu problémů. V tomto příspěvku se podíváme na některé problémy, které má MongoDB s indexy a poli.

Indexy více klíčů

V MongoDB můžete indexovat pole pole a vytvořit tak položku rejstříku pro každý prvek v poli. Výsledný index se nazývá „multikey“ index. Víceklíčové indexy lze vytvářet přes skalární hodnoty nebo vložené dokumenty. Další informace o víceklíčových indexech naleznete v této dokumentaci.

Víceklíčové indexy, i když jsou užitečné, mají několik omezení:

  • Pokud vytvoříte složený víceklíčový index, pak máte maximálně jedno pole, které je polem.
  • Složený index nemůže být zlomkový klíč.
  • Složený index nemůže být hašovaný index.
Omezení indexu MongoDB Multikey – na co si dát pozor ve svých dotazechClick To Tweet

Jedním z nejzajímavějších aspektů víceklíčových indexů je způsob výpočtu hranic průsečíků indexů.

Hranice protínání indexu

Zde je návod, jak dokumentace MongoDB definuje hranice protínání indexu:

„Hranice indexového skenování definují části indexu, které se mají prohledávat během dotazu. Pokud nad indexem existuje více predikátů, MongoDB se pokusí spojit hranice pro tyto predikáty buď průnikem nebo skládání za účelem vytvoření skenu s menšími hranicemi.“

Dotazy na rozsah na poli

Začněme jednoduchým příkladem, abychom viděli, jak MongoDB vypočítává hranice indexu pro dotazy na pole. Předpokládejme, že máme ve sbírce následující tři dokumenty:

{x:65}{x:35}{x:[12,95]}

Zadáme následující dotaz:

db.coll.find({x :{ $gt :22, $lt:55})

Dotaz je dostatečně jednoduchý. Očekávali byste, že odpověď bude {x:35}, ale dotaz vrátí:

{x:35}{x:[25,95]}

Důvod pochází z toho, jak MongoDB pracuje s poli. Stejný prvek pole nemusí odpovídat oběma podmínkám; pokud existuje jeden prvek odpovídající každé podmínce, je to shoda. Takže v tomto případě jsou hranice [22, nekonečno] a [-nekonečno, 55]. Protože se nepoužívá operátor ‚elemMatch‘, MongoDB nepoužívá průsečík indexu. MongoDB nespecifikuje, který z těchto rozsahů [22, Infinity] nebo [-Infinity, 55] bude použit pro provedení dotazu.

Pokud chceme použít průnik indexu, musíme použít následující dotaz:

db.coll.find(x :{ $elemMatch:{$gt :22,$lt:55}})

Když toto použijete, MongoDB protne hranice indexu a jako hranice použije [22, 55]. Jak se očekávalo, tento dotaz nevrací žádné výsledky (elemMatch neodpovídá jiným polím). Takže v podstatě jsou rozsahové dotazy na poli bez operátoru $elemMatch celkem k ničemu.

Složené víceklíčové indexy – směšování polí pole a polí bez pole

Zvažte kolekci s následujícími dokumenty:

{položka:35, ceny:[250,35]}......{položka:106, ceny:[1500,65]}

K této kolekci přidáme složený index:

db.ensureIndex({item:1, prices:1});

Nyní spustíme jednoduchý dotaz:

db. kol. find({item:{$gt:12, $lt:65}});

Dotaz vypadá dostatečně jednoduše, protože používáme položku bez pole s pevným rozsahem. Očekávám, že hranice protínání indexu budou něco jako položka:[[12,65] ] pro dotaz, ale pokud spustíte vysvětlení, uvidíte toto:

"indexBounds" :{"item" :[ [ -Infinity, 65 ] ],"prices" :[ [ { "$minElement" :1 }, { "$maxElement" :1 } ] ]}, 

Důvodem je, že MongoDB detekuje, že se jedná o víceklíčový index, a nezpracovává průnik hranic indexu, bez ohledu na skutečnost, že váš dotaz nepoužívá žádná pole pole. Principem tohoto příběhu je, že když v indexu kombinujete pole a pole bez pole, vždy sledujte hranice průsečíků indexu. Je pravděpodobné, že to není efektivní.


  1. Dotazování po naplnění v Mongoose

  2. Správný způsob importu souboru json do mongo

  3. jaký je střední rozdíl mezi drahokamy Nest a redis-namespace, když používáme redis s rails/ruby

  4. Vyberte vnořená pole v mongo db