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

Proč MongoDB nepoužívá protínání indexů?

Když použijete explain(true) můžete vidět, že optimalizátor zvažuje použití indexového průniku a rozhodl se ne:

"cursor" : "BtreeCursor Age", // Chosen plan.
...
"allPlans" : [
   {
       "cursor" : "BtreeCursor Age",
       ...
   },
   {
       "cursor" : "BtreeCursor Name",
       ...
   },
   {
       "cursor" : "Complex Plan", // Index intersection.
       ...
   }
]

MongoDB nikdy nezvolí průnik, pokud je k dispozici dostatečný složený index. Další omezení lze nalézt na lístku Jira pro Index Intersection:

Optimalizátor dotazů může vybrat plány průsečíků indexů, pokud jsou splněny následující podmínky:
1. Většina dokumentů v příslušné sbírce je na disku. Výhodou průniku indexu je, že se může vyhnout načítání úplných dokumentů, když je velikost průsečíku malá. Pokud jsou dokumenty již v paměti, vyhýbáním se načítání nic nezískáte.
2. Predikáty dotazu jsou jednobodové intervaly, spíše než rozsahové predikáty nebo sada intervalů. Dotazy přes jednobodové intervaly vracejí dokumenty seřazené podle umístění disku, což umožňuje optimalizátoru vybrat plány, které počítají průsečík neblokujícím způsobem. To je obecně rychlejší než alternativní způsob výpočtu průniku, kterým je sestavení hashovací tabulky s výsledky z jednoho indexu a její následné testování s výsledky z druhého indexu.
3. Žádný z indexů, které se mají protnout, není vysoce selektivní. Pokud je jeden z indexů selektivní, pak optimalizátor vybere plán, který jednoduše prohledá tento selektivní index.
4. Velikost průniku je malá vzhledem k počtu indexových klíčů naskenovaných kterýmkoli řešením s jedním indexem. V tomto případě se může vykonavatel dotazu podívat na menší sadu dokumentů pomocí průniku indexů, což nám potenciálně umožní těžit z výhod menšího počtu načtení z disku.

MongoDB má mnoho omezení na křižovatce, což snižuje pravděpodobnost, že bude skutečně použit.




  1. Jak vytvořit vnořený index v MongoDB?

  2. Služba MongoDB ve Fedoře neběží

  3. MongoDB přes Mongoose JS - Co je findByID?

  4. Problémy MongoDB PHP UTF-8