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

jak strukturovat složený index v mongodb

To je spousta otázek v jednom příspěvku;) Dovolte mi, abych je prošel v praktickém pořadí :

  • Každý dotaz může používat nejvýše jeden index (s výjimkou klauzulí $or nejvyšší úrovně a podobně). To zahrnuje jakékoli třídění.
  • Vzhledem k výše uvedenému budete pro svůj problém určitě potřebovat složený index, nikoli samostatné indexy pro jednotlivá pole.
  • Pole s nízkou mohutností (tedy pole s velmi malým počtem jedinečných hodnot ve vaší datové sadě) by obvykle neměla být v indexu, protože jejich selektivita je velmi omezená.
  • Na pořadí polí ve vašem složeném indexu záleží, stejně jako na relativním směru každého pole ve vašem složeném indexu (např. „{jméno:1, věk:-1}“). Na mongodb.org je spousta dokumentace o složených indexech a směrech indexových polí, takže to zde nebudu vše opakovat.
  • Řazení použije index pouze v případě, že je třídicí pole v indexu a je polem v indexu přímo za posledním polem, které bylo použito k výběru sady výsledků. Ve většině případů by to bylo poslední pole indexu.

Stav byste tedy do svého indexu neměli zahrnout vůbec, protože jakmile indexový procházka odstraní velkou většinu dokumentů založených na polích s vyšší mohutností, ve většině případů zbydou nanejvýš 2–3 dokumenty, což je stěží optimalizováno indexem stavu. (zejména proto, že jste zmínil, že tyto 2-3 dokumenty budou mít stejně velmi pravděpodobně stejný stav).

Poslední poznámka, která je ve vašem případě relevantní, je, že když používáte dotazy na rozsah (a vy jste), stejně nepoužije index k řazení. Můžete to zkontrolovat tak, že se po otestování dotazu podíváte na hodnotu „scanAndOrder“ ve vašem vysvětlení(). Pokud tato hodnota existuje a je pravdivá, znamená to, že bude třídit sadu výsledků v paměti (skenovat a objednat), spíše než přímo používat index. Tomu se ve vašem konkrétním případě nelze vyhnout.

Váš index by tedy měl být:

db.posts.ensureIndex({start:1, end:1})

a váš dotaz (pořadí upraveno pouze pro srozumitelnost, optimalizátor dotazů spustí váš původní dotaz stejnou cestou provádění, ale dávám přednost umístění indexovaných polí na první místo a v jejich pořadí):

db.posts.find({start: {$lt: today}, end: {$gt: today}, status: {$gte:0}}).sort({sortOrder:1})



  1. Geoprostorová podpora v MongoDB

  2. MongoDB $last Aggregation Pipeline Operator

  3. Asynchronní iterace kurzoru s asynchronní dílčí úlohou

  4. nainstalovat redis na instanci aws micro