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

Sortowanie według wielu pól Mongo DB

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ć.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Odpowiednik MongoServer.State w sterowniku 2.0

  2. Aktualizacja kolekcji Meteorów z tradycyjnym identyfikatorem

  3. MongoDB jaki jest domyślny użytkownik i hasło?

  4. Jak zainstalować MongoDB

  5. MongoDB odrębny()