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

Ottimizzazione delle prestazioni dello schema MongoDB

La prima cosa che viene in mente qui è:perché l'archiviazione di un riferimento ti costa 5000 volte quello che costa archiviare in un documento secondario?

Ok, guardando il tuo schema credo che il metodo migliore sia la raccolta separata per le parole, non per i pacchetti.

La prima bandiera rossa che ho visto è la tua doppia nidificazione qui:

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

Le words sarà molto difficile lavorare con il sottodocumento nella versione corrente di MongoDB, normalmente 2-3 livelli iniziano ad avere problemi, specialmente con gli operatori posizionali.

Ora considerando che dovresti sempre lavorare dal valore più alto possibile puoi ottenere qui:

Devi anche andare a considerare il costo dell'alloggio di questo documento. Gli operatori di cui hai bisogno saranno quelli in memoria come $pull , $push , $addToSet ecc, il che significa che l'intero documento dovrà essere serializzato e caricato nelle strutture C++ native di MongoDB. Questa sarà un'attività estremamente dispendiosa a seconda del traffico verso quei documenti.

Considerando il tuo commento:

mette semplicemente un altro chiodo nella bara di incorporare le parole all'interno del documento utente principale. Considerando quanto detto nel paragrafo precedente, questo non funzionerà bene con il costo dell'utilizzo di operatori in memoria sulle words matrice.

Funzionerà molto meglio se le parole sono divise, $slice è anche un operatore in memoria e probabilmente subirebbe una riduzione delle prestazioni qui.

E questa è una risposta rapida e ragionata. Sono sicuro che potrei spiegare di più sulla mia ragione, ma dovrebbe essere sufficiente.