Optymalizator zapytań MongoDB działa, próbując różnych planów, aby określić, które podejście działa najlepiej dla danego zapytania. Zwycięski plan dla tego wzorca zapytania jest następnie buforowany dla następnych ~1000 zapytań lub do momentu wykonania explain()
.
Aby zrozumieć, które plany zapytań zostały wzięte pod uwagę, powinieneś użyć explain(1)
, np.:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)
allPlans
szczegóły pokażą wszystkie plany, które zostały porównane.
Jeśli uruchamiasz zapytanie, które nie jest zbyt selektywne (na przykład, jeśli wiele rekordów spełnia kryteria {category: { $ne:'A'}}
), MongoDB może szybciej znaleźć wyniki za pomocą podstawowego kursora (skanowanie tabeli) niż dopasowując je do indeksu.
Kolejność pól w zapytaniu generalnie nie ma to znaczenia przy wyborze indeksu (istnieje kilka wyjątków w przypadku zapytań o zakres). Kolejność pól w sortowaniu wpływa na wybór indeksu. Jeśli Twój sort()
kryteria nie są zgodne z kolejnością indeksu, dane wynikowe muszą zostać ponownie posortowane po użyciu indeksu (powinieneś zobaczyć scanAndOrder:true
w wyjaśnieniu, jeśli tak się stanie).
Warto również zauważyć, że MongoDB użyje tylko jednego indeksu na zapytanie (z wyjątkiem $or
s).
Więc jeśli próbujesz zoptymalizować zapytanie:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
Będziesz chciał uwzględnić wszystkie trzy pola w indeksie:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
FYI, jeśli chcesz zmusić określone zapytanie do użycia indeksu (zwykle nie jest to potrzebne lub zalecane), istnieje hint()
opcja, którą możesz wypróbować.