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

Mongodb Explain for Aggregation framework

Startende med MongoDB version 3.0, skal du blot ændre rækkefølgen fra

collection.aggregate(...).explain()

til

collection.explain().aggregate(...)

vil give dig de ønskede resultater (dokumentation her).

For ældre versioner>=2.6 skal du bruge explain mulighed for aggregerede pipeline-operationer

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

En vigtig overvejelse med Aggregation Framework er, at et indeks kun kan bruges til at hente de indledende data for en pipeline (f.eks. brug af $match , $sort , $geonear i begyndelsen af ​​en pipeline) samt efterfølgende $lookup og $graphLookup niveauer. Når data er blevet hentet ind i aggregeringspipelinen til behandling (f.eks. passerer gennem stadier som $project , $unwind , og $group ) yderligere manipulation vil være i hukommelsen (muligvis ved hjælp af midlertidige filer, hvis allowDiskUse indstillingen er indstillet).

Optimering af pipelines

Generelt kan du optimere aggregeringspipelines ved at:

  • Start af en pipeline med en $match trin for at begrænse behandlingen til relevante dokumenter.
  • Sikring af den indledende $match / $sort stadier understøttes af et effektivt indeks.
  • Tidlig filtrering af data ved hjælp af $match , $limit , og $skip .
  • Minimering af unødvendige stadier og dokumentmanipulation (måske genoverveje dit skema, hvis kompliceret samlingsgymnastik er påkrævet).
  • Udnyttelse af nyere aggregeringsoperatører, hvis du har opgraderet din MongoDB-server. For eksempel tilføjede MongoDB 3.4 mange nye aggregeringsstadier og udtryk, herunder understøttelse af arbejde med arrays, strenge og facetter.

Der er også en række Aggregation Pipeline Optimizations, der automatisk sker afhængigt af din MongoDB serverversion. For eksempel kan tilstødende trin samles og/eller omarrangeres for at forbedre udførelsen uden at påvirke outputresultaterne.

Begrænsninger

Som i MongoDB 3.4, explain aggregeringsrammen option giver information om, hvordan en pipeline behandles, men understøtter ikke samme detaljeringsgrad som executionStats tilstand for en find() forespørgsel. Hvis du er fokuseret på at optimere den indledende udførelse af forespørgsler, vil du sandsynligvis finde det en fordel at gennemgå den tilsvarende find().explain() forespørgsel med executionStats eller allPlansExecution ordlyd.

Der er et par relevante funktionsanmodninger om at se/stemme op i MongoDB-problemsporingen vedrørende mere detaljerede udførelsesstatistikker for at hjælpe med at optimere/profilere aggregeringspipelines:

  • SERVER-19758:Tilføj "executionStats" og "allPlansExecution" forklaringstilstande til aggregeringsforklaring
  • SERVER-21784:Spor eksekveringsstatistikker for hvert aggregeringspipelinetrin og eksponer via forklaring
  • SERVER-22622:Forbedre $lookup explain for at angive forespørgselsplan på "fra"-samlingen


  1. Hvad er de underliggende forskelle mellem select, epoll, kqueue og evport?

  2. Betinget gruppering med $ findes inde i $cond

  3. Redis, sessionsudløb og omvendt opslag

  4. Laravel Redis konfiguration