sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB-schemaprestandaoptimering

Det första som kommer att tänka på här är:varför kostar det att lagra en referens dig 5000 gånger vad det kostar att lagra i ett underdokument?

Okej, när jag tittar på ditt schema tror jag att den bästa metoden är separat insamling av ord, inte paket.

Den första röda flaggan jag såg är ditt dubbla häckande här:

packages : [{
    package : {type: Schema.Types.ObjectId, ref: 'Packages'},
    from : {type : Schema.Types.ObjectId, ref :'Languages'},
    to : {type : Schema.Types.ObjectId, ref :'Languages'},
    words : [{
        word: {type: String},
        progress: {type: Number,default : 0}
    }]
}]

words underdokument kommer att vara mycket svårt att arbeta med i den nuvarande versionen av MongoDB, normalt 2-3 nivåer djupa börjar få problem, särskilt med positionsoperatörer.

Nu med tanke på att du alltid ska arbeta utifrån högsta möjliga värde du kan få här:

Du har också gå att överväga kostnaden för boende detta dokument. Operatörerna du behöver kommer att vara i minnet som $pull , $push , $addToSet etc vilket innebär att hela ditt dokument måste serialiseras och laddas in i MongoDB:s inbyggda C++-strukturer. Detta kommer att vara en extremt krävande uppgift beroende på trafiken till dessa dokument.

Med tanke på din kommentar:

det sätter bara ytterligare en spik i kistan för att bädda in orden i huvudanvändardokumentet. Med tanke på vad jag sa i föregående stycke kommer detta inte att fungera bra med kostnaden för att använda in-memory operatorer på words array.

Detta kommer att fungera mycket bättre om orden delas ut, $slice är också en operatör i minnet och skulle förmodligen drabbas av försämrad prestanda här.

Och det är ett snabbt motiverat svar. Jag är säker på att det finns mer jag skulle kunna förklara om mitt skäl, men det borde vara tillräckligt.



  1. Får fel:Route() i Route kan inte tillämpas på String

  2. Kubernetes statefulset med NFS-beständig volym

  3. Redis (ioredis) - Kan inte fånga anslutningsfel för att hantera dem på ett elegant sätt

  4. MongoDB $sqrt