sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB sammanlagda pipeline långsam efter första matchsteget

2019 SVAR

Detta svar är för MongoDB 4.2

Efter att ha läst frågan och diskussionen mellan er tror jag att problemet är löst men fortfarande är optimering ett vanligt problem för alla som använder MongoDB.

Jag stötte på samma problem, och här är tipsen för frågeoptimering.

Rätta mig om jag har fel :)

1. Lägg till index på insamling

Index spelar en viktig roll för att köra frågor snabbt eftersom index är datastrukturer som kan lagra samlingens datauppsättning i en form som är lätt att gå igenom. Frågor exekveras effektivt med hjälp av index i MongoDB.

Du kan skapa en annan typ av index efter dina behov. Läs mer om index här, den officiella MongoDB-dokumentationen.

2. Pipeline optimering

  • Använd alltid $match före $project , eftersom filter tar bort extra dokument och fält från nästa steg.
  • Kom alltid ihåg att index används av $match och $sort . Så försök att lägga till ett index i fälten där du ska sortera eller filtrera dokument.
  • Försök att behålla denna sekvens i din fråga, använd $sort före $limit som $sort + $limit + $skip. Eftersom $sort drar fördel av indexet och tillåter MongoDB att välja önskad frågeplan medan frågan körs.
  • Använd alltid $limit före $skip så att hoppa över kommer att tillämpas för att begränsa dokument.
  • Använd $project för att endast returnera nödvändiga data i nästa steg.
  • Skapa alltid ett index på outsideField-attributen i en $lookup . Eftersom lookup producerar en array, kopplar vi i allmänhet ner den i nästa steg. Så istället för att varva ner det i nästa steg, varva ner det i uppslagningen som:

    {
    $lookup: {
        from: "Collection",
        as: "resultingArrays",
        localField: "x",
        foreignField: "y",
        unwinding: { preserveNullAndEmptyArrays: false }
    

    }}

  • Använd allowDiskUse i aggregering kan aggregeringsoperationer med hjälp av den skriva data till underkatalogen _tmp i katalogen Database Path. Den används för att utföra den stora frågan på temp-katalogen. Till exempel:

     db.orders.aggregate(
     [
            { $match: { status: "A" } },
            { $group: { _id: "$uid", total: { $sum: 1 } } },
            { $sort: { total: -1 } }
     ],
     {
            allowDiskUse: true
     },
     )
    

3. Bygg om indexen

Om du skapar och tar bort index ganska ofta, bygg sedan om dina index. Det hjälper MongoDB att uppdatera den tidigare lagrade frågeplanen i cachen, som fortsätter att ta över den nödvändiga frågeplanen, tro mig, det problemet suger :(

4. Ta bort oönskade index

För många index tar för mycket tid att skapa, uppdatera och ta bort eftersom de behöver skapa index tillsammans med sina uppgifter. Så, ta bort dem hjälper mycket.

5. Begränsande dokument

I ett verkligt scenario hjälper det inte att hämta fullständiga data som finns i databasen. Dessutom kan du antingen inte visa den eller så kan användaren inte läsa fullständiga hämtade data. Så istället för att hämta fullständiga data, hämta data i bitar, vilket hjälper både dig och din klient att titta på dessa data.

Och slutligen hjälper det att ta reda på huvudproblemet genom att titta på vilken genomförandeplan som väljs ut av MongoDB. Så $explain hjälper dig att ta reda på det.

Hoppas denna sammanfattning kommer att hjälpa er, kom gärna med förslag på nya punkter om jag missade några. Jag kommer att lägga till dem också.




  1. Redis anpassade kommandon

  2. Hur sorterar man array inuti samlingsposten i MongoDB?

  3. Använda flera Mongodb-databaser med Meteor.js

  4. MongoDB punkt (.) i nyckelnamn