MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dlaczego MongoDB nie używa przecięcia indeksu?

Kiedy używasz explain(true) widać, że optymalizator rozważa użycie przecięcia indeksu i postanawia nie:

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

MongoDB nigdy nie wybierze przecięcia, jeśli istnieje wystarczający indeks złożony. Inne ograniczenia można znaleźć na bilecie Jira na skrzyżowanie indeksów:

Optymalizator zapytań może wybrać plany przecięcia indeksu, gdy spełnione są następujące warunki:
1. Większość dokumentów w odnośnym zbiorze znajduje się na dysku. Zaletą przecięcia indeksów jest to, że pozwala uniknąć pobierania kompletnych dokumentów, gdy rozmiar przecięcia jest mały. Jeśli dokumenty są już w pamięci, nie ma nic do zyskania unikając pobierania.
2. Predykaty zapytania są interwałami jednopunktowymi, a nie predykatami zakresu lub zestawem interwałów. Zapytania w odstępach jednopunktowych zwracają dokumenty posortowane według lokalizacji na dysku, co pozwala optymalizatorowi wybrać plany obliczające przecięcie w sposób nieblokujący. Jest to generalnie szybsze niż alternatywny tryb obliczania przecięcia, który polega na zbudowaniu tablicy mieszającej z wynikami z jednego indeksu, a następnie sondowaniu jej wynikami z drugiego indeksu.
3. Żaden z przecinanych indeksów nie jest wysoce selektywny. Jeśli jeden z indeksów jest selektywny, optymalizator wybierze plan, który po prostu skanuje ten selektywny indeks.
4. Rozmiar przecięcia jest mały w stosunku do liczby kluczy indeksu skanowanych przez jedno z rozwiązań z jednym indeksem. W tym przypadku executor zapytania może przeglądać mniejszy zestaw dokumentów za pomocą przecięcia indeksów, co potencjalnie pozwala nam czerpać korzyści z mniejszej liczby pobierań z dysku.

MongoDB ma wiele ograniczeń na skrzyżowaniu, co sprawia, że ​​jest mniej prawdopodobne, że będzie faktycznie używany.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Trendy NoSQL — MongoDB, Cassandra, CouchDB i Riak

  2. Jak sortować w manguście?

  3. Strumienie Mongo Change uruchamiane wiele razy (tak jakby):aplikacja Node działająca w wielu instancjach

  4. MongoDB — Rozwiń tablicę za pomocą agregacji i usuń duplikaty

  5. Zrozumienie i zarządzanie miejscem na dysku na serwerze MongoDB