Project

General

Profile

Knowledge Base - MongoDB

  • Cold dotazy jsou drahe stoji hodne casu, nasledujici hot dotazy jsou uz pak rychle
  • Zvlastni chovani Monga pri vyberu vsech polozek (rychlejsi odpoved) vs. jen poslednich X stranek pomoci SKIP LIMIT (pomalejsi odpoved)
    • Vidíme že vo väčšine prípadov trvá vyčítanie len poslednej stránky výrazne dlhšie ako vyčítanie celej množiny.
    • Jediný prípad kde sa to nedeje je HAWAT3, čo je obmedzenie len na čas a kategóriu.
    • Pri väčšom množstve vrátených záznamov už je použitie SKIP+LIMIT efektívnejšie ako prečítanie celého súboru, ale rozdiel je v podstate príliš malý (pri HAWAT1: ~73s celý súbor, ~60s len posledná stránka).
    • Podľa explain() je rozdiel v tom, že pri HAWAT3 sa aplikuje SKIP fáza s nenulovou hodnotou (skok asi do polovice tabuľky), zatiaľ čo napr. u HAWAT1 je to 0 a teda sú vyčítané dokumenty od začiatku.
  • TS3.2 predpokladateľne ukazuje, že opačné radenie dotaz mierne spomalí. To vyzerá byť konzistentné naprieč dotazmi aj variantami dotazovania.
  • Pozor na pole a relační operátory. Dotaz X > 3 and X < 8 matchne i pole X = [2, 9], protože v X je alespoň jedna položka menší, než 8 (2), a alespoň jedna větší, než 3 (9). Je potřeba použít $elemMatch, viz také #3045.

Indexy

Indexy a řazení

  • https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/
  • Umí použít index k řazení, pokud sort key je prefixem použitého indexu (index nad a, nebo a-b)
    • db.data.find( { a: { $gt: 1234 }, b: { $gt: 5678 } } ).sort({a: -1})
  • Použití indexu pro řazení v opačném směru je méně efektivní
  • Pokud sort key není prefixem, údajně musí být suffix a predikáty prefix, ale to funguje jen pokud predikáty jsou exaktní (ne range/multivalue dotaz), a pokud případný range dotaz je pouze na sortkey
    • db.data.find( { a: 5 } ).sort( { b: 1, c: 1 } ) # index { a: 1 , b: 1, c: 1 }
    • db.data.find( { b: 3, a: 4 } ).sort( { c: 1 } ) # index { a: 1, b: 1, c: 1 }
    • db.data.find( { a: 5, b: { $lt: 3} } ).sort( { b: 1 } ) # index { a: 1, b: 1 }

Efektivita indexů

Návrh indexu (shrnutí ze zkušeností)

Compound index pro konkrétní query by měl být složen takto:

  • eqA, eqB, eqC, ... , sortkeyA, sortkeyB, multiA, multiB, ...

Kde:

  • eqX jsou predikáty absolutního porovnání nad single položkou
    • tj. např. {'a': 3}, nebo {'a' : { '$eq': 3}}
    • a nesmí být pole
  • sortkeyX - řadící klíče, ve správném směru
    • tedy např. find(...).sort({sortkeyA:1, sortkeyB:-1, sortkeyC:-1})
    • součástí query mohou být range ($lt, $gt) queries na sortkey
  • multiX - cokoliv, co vrací víc výsledků - range query, $in, $eq na pole, atd.
  • je třeba vzít v úvahu, že v klíči může být současně jen jedno pole
    • ale mohou tam být dvě položky, které jsou součástí jednoho pole, např. je-li 'a' pole, pak index {a.X: 1, a.Y: 1} je ok

Ladění

Explain

Profiling (dlouho běžící dotazy)

Komentář k dotazu

Beletrie