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

MongoDB skema ydeevne optimering

Det første, der kommer til at tænke på her, er:hvorfor koster lagring af en reference dig 5000 gange, hvad det koster at gemme i et underdokument?

Okay, ser jeg på dit skema, tror jeg, at den bedste metode er separat indsamling af ord, ikke pakker.

Det første røde flag, jeg så, er din dobbelte rede her:

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 vil være meget svært at arbejde med i den nuværende version af MongoDB, normalt begynder 2-3 niveauer dybt at have problemer, især med positionsoperatører.

Nu i betragtning af, at du altid skal arbejde ud fra den højest mulige værdi, du kan få her:

Du skal også overveje boligomkostningerne i dette dokument. De operatører, du skal bruge, vil være i hukommelsen, såsom $pull , $push , $addToSet etc, hvilket betyder, at hele dit dokument skal serialiseres og indlæses i MongoDBs oprindelige C++-strukturer. Dette vil være en ekstremt krævende opgave afhængigt af trafikken til disse dokumenter.

I betragtning af din kommentar:

det sætter blot endnu et søm i kisten for at indlejre ordene i hovedbrugerdokumentet. I betragtning af, hvad jeg sagde i det foregående afsnit, vil dette ikke fungere godt med omkostningerne ved at bruge in-memory operatorer på words array.

Dette vil fungere meget bedre, hvis ordene er delt ud, $slice er også en operatør i hukommelsen og vil sandsynligvis lide under en forringet ydeevne her.

Og det er et hurtigt begrundet svar. Jeg er sikker på, at der er mere, jeg kunne forklare om min grund, men det burde være nok.



  1. Redis SYNC og EXEC

  2. MongoError:der er ingen brugere, der er godkendt

  3. Sæt grænser for mongo db-samling

  4. MongoError,err:E11000 duplikatnøglefejl