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

Proč různé plány dotazů MongoDB ukazují jinou hodnotu nReturned?

To bylo vysvětleno v režimu allPlansExecution dokumentační stránku. Abych parafrázoval:

Pokud během výběru plánu existuje více než jeden index, který může uspokojit dotaz, MongoDB spustí zkušební verzi se všemi platnými plány, aby určil, který z nich fungoval nejlépe. Viz Plány dotazů podrobnosti o tomto procesu.

Od MongoDB 3.4.6 výběr plánu zahrnuje paralelní spuštění plánů kandidátů v „závodě“ a podívejte se, který plán kandidátů vrátí 101 výsledků jako první. Ve vašem příkladu výše, v době, kdy vítězný plán vrátil 101 výsledků v závodě, plán poražení zvládl pouze 2 výsledky. Vítězný plán se poté dokončí. To je důvod, proč plán ztrát zobrazuje pouze nReturned: 2 ve statistikách.

Tento „závod“ se provádí, protože pokud existují dva identicky vypadající plány, MongoDB neví, který plán je pro konkrétní dotaz nejlepší, kvůli flexibilitě dokumentů JSON (na rozdíl např. od SQL, kde je struktura tabulek známá) . Samozřejmě je zcela možné, že MongoDB odhadne špatně a skončí s méně výkonným plánem, protože jde o empirický proces. Z tohoto důvodu je nejlepší vytvořit indexy, které podporují vaše dotazy, aby MongoDB nemusel hádat. Jinak můžete použít hint() říci MongoDB, který index má použít pro určitý dotaz.

Proto:

  • Statistika vítězného plánu je statistika skutečného výsledku dotazu.
  • Statistiky pro ztracené plány zobrazují pouze statistiky pro zkušební běh plánování dotazů.
  • Výběr plánu zahrnuje spuštění „závodu“ se 101 výsledky. Tento závod se provádí pouze v případě, že existuje více indexů, které mohou uspokojit dotaz.

Poznámka 1 :Ani jeden ze dvou plánů, které jsi viděl, nebyl skvělý. Vítězný plán ukazuje "nReturned" : 43 , "totalKeysExamined" : 221 a "totalDocsExamined" : 219 . To znamená, že MongoDB potřebuje prozkoumat 219 dokumentů, jen aby vrátil 43 z nich:pouze 20% účinnost . V ideálním případě chcete mít nReturned čísla rovnající se totalDocsExamined .

Poznámka 2 :Zkuste vytvořit složený index {'rack_name': 1, 'timestamp': 1} . Se stejným dotazem byste měli získat lepší číslo účinnosti.

Poznámka 3 :Všimněte si, že od allPlansExecution bylo zadáno, vše statistiky vám MongoDB řádně vrací kvůli důkladnosti, přičemž na konečné nReturned to nemá žádný vliv výsledek. Byl to zamítnutý plán a nReturned: 2 číslo může být matoucí. Pokud používáte executionStats, tuto statistiku neuvidíte nastavení. Primárně allPlansExecution se používá k doladění a určení, proč jsou některé plány zamítnuty.




  1. řešení situací redis maxmemory s raily při použití rails cachingu

  2. Jak obnovit konkrétní kolekci v MongoDB pomocí logického zálohování

  3. Použití deklarace nebylo nalezeno v ovladači mongodb c++

  4. Když MongoDB vloží datum, převede ho na UTC