2013-03-24 8 views
10

Almoust wszystkie moje dokumenty zawierają 2 pola, czas rozpoczęcia i koniec znacznika czasu. I w każdym moim zapytaniu muszę dostać elementy, które są w wybranym okresie czasu. więc start powinien być po wybranej wartości, a ostateczna powinna być przed wybranym znacznikiem czasu.Strategia indeksu mongodb dla zapytania zakresu z różnymi polami

zapytanie wygląda

db.collection.find({start:{$gt:DateTime(...)}, final:{$lt:DateTime(...)}}) 

więc co najlepsza strategia indeksowania dla tego scenariusza?


Nawiasem mówiąc, co jest lepsze dla wydajności - do tej pory sklep jak datetimes lub znaczników czasu Uniksa, który jest wartość długo sama

Odpowiedz

3

Można użyć Compound index aby utworzyć indeks dla wielu dziedzin .

db.collection.ensureIndex({start: 1, final: 1}) 

Porównaj różne zapytania i indeksów przy użyciu explain(), aby uzyskać jak najwięcej z bazy danych

+0

Tak, wiem o indeksie composit. Jedyne, czego obawiam się w tym przypadku, nie będzie korzyści dla zapytania złożonego w pojedynczym zapytaniu polowym. Ale nie wiem na pewno. Pomyśl o niektórych eksperymentach. –

+0

Dopóki pojedyncze pole jest pierwszym polem w indeksie złożonym, dobrze jest przejść – baloo

11

Zbyt dodać trochę więcej do Baloo „s odpowiedź.

W przypadku znacznika czasu i dłuższego wydania. Ogólnie serwer MongoDB nie zauważy różnicy. Długość kodowania BSON jest taka sama (64 bity). Możesz zobaczyć wydajność różniącą się po stronie klienta w zależności od kodowania sterownika. Na przykład po stronie Java przy użyciu sterownika 10gen znacznik czasu jest renderowany jako Date, który jest dużo cięższy niż Long. Istnieje drivers, które próbują uniknąć tego nad głową.

Inną kwestią jest zwiększenie wydajności w przypadku zamknięcia zakresu pierwszego pola indeksu. Więc jeśli używasz indeksu sugeruje Baloo:

db.collection.ensureIndex({start: 1, final: 1}) 

kwerendy wystąpi (potencjalnie dużo) lepiej, jeśli zapytanie jest:

db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)}, 
        final:{$lt:DateTime(...)}}) 

koncepcyjnym, jeśli myślisz o indeksach jak aa drzewo zamknięty zasięg ogranicza obie strony drzewa zamiast jednej strony. Bez zamkniętego zakresu serwer musi "sprawdzić" wszystkie wpisy z wartością większą niż podany znacznik czasu, ponieważ nie zna zależności między start i final.

Można nawet stwierdzić, że wydajność zapytań nie jest lepiej przy użyciu jednego wskaźnika pola jak:

db.collection.ensureIndex({start: 1}) 

większość oszczędności wynosi od przycinania pierwszego pola. Przypadku, w którym nie ma to miejsca, jest sytuacja, gdy kwerenda jest objęta indeksem, a kolejność/sortowanie wyników można uzyskać z indeksu.

HTH - Rob.

+0

Świetna informacja o górnym limicie pierwszego elementu.Jest to bardzo naturalne i może mieć duży wpływ na wydajność. =) Ale wciąż waha się między indeksem pojedynczego pola a indeksem złożonym. Pomyśl o niektórych eksperymentach. –

Powiązane problemy