sql >> Database >  >> NoSQL >> MongoDB

Mongodb Explain voor aggregatieraamwerk

Beginnend met MongoDB versie 3.0, eenvoudig de volgorde wijzigen van

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

naar

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

geeft u de gewenste resultaten (documentatie hier).

Voor oudere versies>=2.6 moet u de explain . gebruiken optie voor aggregatiepijplijnbewerkingen

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
  }
)

Een belangrijke overweging bij het Aggregation Framework is dat een index alleen kan worden gebruikt om de initiële gegevens voor een pijplijn op te halen (bijv. gebruik van $match , $sort , $geonear aan het begin van een pijplijn) en vervolgens $lookup en $graphLookup stadia. Zodra gegevens zijn opgehaald in de aggregatiepijplijn voor verwerking (bijv. door fasen zoals $project , $unwind , en $group ) verdere manipulatie zal in het geheugen zijn (mogelijk met behulp van tijdelijke bestanden als de allowDiskUse optie is ingesteld).

Pijpen optimaliseren

Over het algemeen kunt u aggregatiepijplijnen optimaliseren door:

  • Een pijplijn starten met een $match stap om de verwerking te beperken tot relevante documenten.
  • Zorgen voor de eerste $match / $sort stadia worden ondersteund door een efficiënte index.
  • Gegevens vroeg filteren met $match , $limit , en $skip .
  • Het minimaliseren van onnodige fasen en documentmanipulatie (misschien heroverwegen van uw schema als ingewikkelde aggregatiegymnastiek vereist is).
  • Profiteren van nieuwere aggregatie-operators als je je MongoDB-server hebt geüpgraded. MongoDB 3.4 heeft bijvoorbeeld veel nieuwe aggregatiestadia en -expressies toegevoegd, inclusief ondersteuning voor het werken met arrays, strings en facetten.

Er zijn ook een aantal Aggregation Pipeline-optimalisaties die automatisch plaatsvinden, afhankelijk van uw MongoDB-serverversie. Aangrenzende fasen kunnen bijvoorbeeld worden samengevoegd en/of opnieuw gerangschikt om de uitvoering te verbeteren zonder de uitvoerresultaten te beïnvloeden.

Beperkingen

Zoals bij MongoDB 3.4, het Aggregation Framework explain optie geeft informatie over hoe een pijplijn wordt verwerkt, maar ondersteunt niet hetzelfde detailniveau als de executionStats modus voor een find() vraag. Als u zich richt op het optimaliseren van de initiële uitvoering van query's, vindt u het waarschijnlijk nuttig om de equivalente find().explain() te bekijken. query met executionStats of allPlansExecution breedsprakigheid.

Er zijn een paar relevante functieverzoeken om te bekijken/upvoten in de MongoDB-probleemtracker met betrekking tot meer gedetailleerde uitvoeringsstatistieken om aggregatiepijplijnen te optimaliseren/profileren:

  • SERVER-19758:"executionStats" en "allPlansExecution" uitlegmodi toevoegen aan aggregatie uitleggen
  • SERVER-21784:Houd uitvoeringsstatistieken bij voor elke aggregatiepijplijnfase en leg deze bloot via Explain
  • SERVER-22622:Verbeter $lookup Explain om het queryplan op de "from"-verzameling aan te geven


  1. Wat is Hadoop-cluster? Best practices om Hadoop-clusters te bouwen

  2. Hoe gegevens doorgeven tussen meerdere Lua State (multi-thread)?

  3. Voordelen van MongoDB | Nadelen van MongoDB

  4. Welke MongoDB-gebruikersrechten heb ik nodig om een ​​gebruiker toe te voegen aan een nieuwe/andere mongo-database?