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

Indeksy wielokluczowe MongoDB i obwiednie przecięcia indeksów

MongoDB świetnie obsługuje tablice i zapewnia dużą elastyczność w trybie dokumentów. Na przykład możesz osadzać tablice w dokumentach, a także osadzać dokumenty w tablicach itp. Jednak praca z tablicami ma wiele problemów w MongoDB. W tym poście przyjrzymy się niektórym problemom MongoDB z indeksami i tablicami.

Indeksy wielokluczowe

W MongoDB możesz indeksować pole tablicy, aby utworzyć wpis indeksu dla każdego elementu tablicy. Wynikowy indeks nazywany jest indeksem „wielokluczowym”. Indeksy wielokluczowe można tworzyć na wartościach skalarnych lub dokumentach osadzonych. Więcej informacji na temat indeksów wielokluczowych można znaleźć w tej dokumentacji.

Indeksy wielokluczowe, choć przydatne, mają kilka ograniczeń:

  • Jeśli tworzysz złożony indeks wielokluczowy, masz co najmniej jedno pole, które jest tablicą.
  • Indeks złożony nie może być kluczem fragmentu.
  • Indeks złożony nie może być indeksem haszowanym.
Ograniczenia indeksu MongoDB Multikey — na co zwracać uwagę w swoich zapytaniachKliknij, aby tweetować

Jednym z najciekawszych aspektów indeksów wielokluczowych jest sposób obliczania granic przecięcia indeksów.

Indeksuj granice przecięcia

Oto jak dokumentacja MongoDB definiuje granice przecięcia indeksów:

„Granice skanowania indeksu definiują części indeksu do przeszukania podczas zapytania. Gdy istnieje wiele predykatów nad indeksem, MongoDB spróbuje połączyć granice tych predykatów przez przecięcie lub złożenie w celu uzyskania skanu z mniejszymi granicami”.

Zapytania o zakres w tablicach

Zacznijmy od prostego przykładu, aby zobaczyć, jak MongoDB oblicza granice indeksu dla zapytań w tablicach. Załóżmy, że mamy w kolekcji następujące trzy dokumenty:

{x: 65}
{x: 35}
{x: [12,95]}

Wysyłamy następujące zapytanie:

db.coll.find({x :{ $gt :22, $lt:55})

Zapytanie jest dość proste. Można oczekiwać, że odpowiedź będzie {x:35}, ale zapytanie zwraca:

{x:35}
{x:[25,95]}

Powód pochodzi ze sposobu, w jaki MongoDB radzi sobie z tablicami. Ten sam element tablicy nie musi spełniać obu warunków; tak długo, jak istnieje jeden element pasujący do każdego warunku, jest to dopasowanie. Tak więc w tym przypadku granice to [22, Nieskończoność] i [-Nieskończoność, 55]. Ponieważ operator „elemMatch” nie jest używany, MongoDB nie używa przecięcia indeksu. MongoDB nie określa, który z tych zakresów [22, Infinity] lub [-Infinity, 55] zostanie użyty do wykonania zapytania.

Jeśli chcemy użyć przecięcia indeksu, musimy użyć następującego zapytania:

db.coll.find(x :{ $elemMatch:{$gt :22,$lt:55}})

Kiedy używasz tego, MongoDB przecina granice indeksu i używa [22, 55] jako granic. Zgodnie z oczekiwaniami to zapytanie nie zwraca żadnych wyników (elemMatch nie pasuje do tablic innych niż). Zasadniczo zapytania o zakres w tablicach są dość bezużyteczne bez operatora $elemMatch.

Złożone indeksy wielokluczowe — mieszanie pól tablicowych i nietablicowych

Rozważ kolekcję z następującymi dokumentami:

{item: 35, prices:[250,35]}
......
{item: 106, prices:[1500,65]}

Dodamy indeks złożony do tej kolekcji:

db.ensureIndex({item:1, prices:1});

Teraz uruchommy proste zapytanie:

db. coll. find({item: {$gt:12, $lt:65}});

Zapytanie wygląda dość prosto, ponieważ używamy elementu bez tablicy ze stałym zakresem. Spodziewam się, że granice przecięcia indeksu będą podobne do elementu:[[12,65]] dla zapytania, jednak jeśli uruchomisz wyjaśnienie, zobaczysz to:

"indexBounds" : {
"item" : [ [ -Infinity, 65 ] ],
"prices" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ]
},

Powodem jest to, że MongoDB wykrywa, że ​​jest to indeks wielokluczowy, i nie przetwarza przecięcia granic indeksu, niezależnie od tego, że zapytanie nie używa żadnych pól tablicowych. Morał tej historii jest taki, że kiedy mieszasz pola tablicowe i nietablicowe w indeksie, zawsze miej oko na granice przecięcia indeksu. Szanse są takie, że nie jest to wydajne.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak dynamicznie tworzyć schematy z mangusty?

  2. Przeszukaj wszystkie kolekcje Mongo i wykonaj zapytanie

  3. Instalowanie i uruchamianie MongoDB na OSX

  4. Utwórz indeks tekstowy z różnymi wagami pól w MongoDB

  5. Czy bazy danych zorientowane na dokumenty mają zastąpić relacyjne bazy danych?