sql >> Database teknologi >  >> NoSQL >> MongoDB

Sortering på Flere felter mongo DB

MongoDB-forespørgselsoptimeringsværktøjet virker ved at prøve forskellige planer for at bestemme, hvilken tilgang der fungerer bedst for en given forespørgsel. Vinderplanen for det forespørgselsmønster cachelagres derefter for de næste ~1.000 forespørgsler, eller indtil du laver en explain() .

For at forstå, hvilke forespørgselsplaner der blev overvejet, bør du bruge explain(1) , f.eks.:

db.col.find({category:'A'}).sort({updated: -1}).explain(1)

allPlans detaljer vil vise alle planer, der blev sammenlignet.

Hvis du kører en forespørgsel, som ikke er særlig selektiv (f.eks. hvis mange poster matcher dine kriterier for {category: { $ne:'A'}} ), kan det være hurtigere for MongoDB at finde resultater ved hjælp af en BasicCursor (tabelscanning) i stedet for at matche mod et indeks.

Rækkefølgen af ​​felter i forespørgslen generelt ikke gør en forskel for indeksvalget (der er nogle få undtagelser med intervalforespørgsler). Rækkefølgen af ​​felter i en sortering påvirker indeksvalget. Hvis din sort() kriterierne stemmer ikke overens med indeksrækkefølgen, resultatdataene skal sorteres igen, efter at indekset er brugt (du skal se scanAndOrder:true i forklare-output, hvis dette sker).

Det er også værd at bemærke, at MongoDB kun vil bruge ét indeks pr. forespørgsel (med undtagelse af $or s).

Så hvis du forsøger at optimere forespørgslen:

db.col.find({category:'A'}).sort({updated: -1, rating: -1})

Du vil medtage alle tre felter i indekset:

db.col.ensureIndex({category: 1, updated: -1, rating: -1})

FYI, hvis du vil tvinge en bestemt forespørgsel til at bruge et indeks (normalt ikke nødvendigt eller anbefalet), er der et hint() mulighed du kan prøve.



  1. Skriv på Slave redis db

  2. Redis, lytter til pubsub-begivenheder og gør dem til en stream for mere pålideligt forbrug

  3. Redis er langsom til at få store strenge

  4. hvorfor reduceres brugen af ​​Redis-hukommelsen ikke, når halvdelen af ​​nøglerne dels