2011-11-02 10 views
7

Rozumiem, że w przypadku MongoDB, aby zapytanie wykorzystywało indeks złożony, musi używać WSZYSTKICH kluczy w indeksie lub przynajmniej niektórych kluczy zaczynając od lewej. Na przykład:Wskaźniki złożone z Mongo, używające mniej niż wszystkiego w zapytaniu

db.products.find({ "a":"foo", "b":"bar" }) 

Z przyjemnością wykorzystamy indeks złożony z {a, b, c}.

Jednakże, jeśli chcę zapytać:

db.products.find({"a":"foo", "c":"thing" }) 

wierzę, to nie może korzystać z indeksu. Można to rozwiązać, dodając banalny warunek do "b", np.

db.products.find({"a":"foo", "b":{ $ne : "" }, "c":"thing" }) 

Nawet jeśli nie zależy mi na wartości b. Powodem tego jest fakt, że obecnie mamy 45 milionów obiektów i będzie nadal rosnąć, więc chcemy skonsolidować nasze indeksy, aby zaoszczędzić na zasobach.

Wielkie dzięki.

+0

możesz dać wyjaśnienia tych pytań? –

+0

Twoje zrozumienie jest bezwzględnie prawdziwe w przypadku podwójnego indeksu złożonego, ale niekoniecznie jest prawdziwe w potrójnym indeksie złożonym. Używając objaśnienia zobaczysz, że indeks a, b, c będzie w rzeczywistości używany, gdy będziesz pytać o a, c. –

Odpowiedz

3

Ogólnie rzecz biorąc, zapytanie w indeksie wielu kolumn, który nie ogranicza w wystarczającym stopniu dopasowań do jednej z kolumn, ograniczy przydatność indeksu wielu kolumn. W twoim przykładzie użycie kryterium zapytania o numerze {"a":"foo", "b":{$ne:""}, "c":"thing"} ograniczy przydatność indeksu {a,b,c} do dopasowania tylko na a. Jeśli twoje kryteria zapytania będą często wykonywane, utwórz indeks {a,c,b} (lub {a,c}, jeśli b nie zostanie użyty w kryteriach zapytania).

Użyj funkcji explain w swoich zapytaniach, aby sprawdzić, czy indeks jest wykorzystywany do pełnego potencjału. Jeśli explain mówi, że indexOnly jest true, to zapytanie używa tylko indeksu do znalezienia pasujących dokumentów; w przeciwnym razie MongoDB musi przejrzeć każdy dokument, aby znaleźć dopasowania.

W celu uzyskania dalszych informacji, patrz:

0

W rzeczywistości, przy użyciu nowszych wersji Mongo, twój {a, b, c} wskaźnik będzie używane, gdy istnieje zapytanie na temat {a, c} bez trywialnego warunku na b. Zweryfikowałem to za pomocą polecenia explain.

Jest to szczegółowe omówienie tutaj: Mongo Triple Compound Index

Powiązane problemy