RISPOSTA 2019
Questa risposta è per MongoDB 4.2
Dopo aver letto la domanda e la discussione tra voi ragazzi, credo che il problema sia stato risolto, ma l'ottimizzazione è comunque un problema comune a tutti coloro che utilizzano MongoDB.
Ho affrontato lo stesso problema ed ecco i suggerimenti per l'ottimizzazione delle query.
Correggimi se sbaglio :)
Gli indici svolgono un ruolo fondamentale nell'esecuzione rapida delle query poiché gli indici sono strutture di dati in grado di archiviare il set di dati della raccolta in un modulo facile da attraversare. Le query vengono eseguite in modo efficiente con l'aiuto degli indici in MongoDB.
È possibile creare un diverso tipo di indici in base alle proprie esigenze. Scopri di più sugli indici qui, la documentazione ufficiale di MongoDB.
- Utilizza sempre $match prima di $project , poiché i filtri rimuovono documenti e campi extra dalla fase successiva.
- Ricorda sempre che gli indici sono usati da $match e $sort . Quindi, prova ad aggiungere un indice ai campi su cui andrai a ordinare o filtrare i documenti.
- Cerca di mantenere questa sequenza nella tua query, usa $sort before $limit come $ordina + $limite + $salta. Perché $sort sfrutta l'indice e consente a MongoDB di selezionare il piano di query richiesto durante l'esecuzione della query.
- Utilizza sempre $limit prima di $skip in modo che il salto venga applicato per limitare i documenti.
- Utilizza $project per restituire solo i dati necessari nella fase successiva.
-
Crea sempre un indice sugli attributi ForeignField in una $lookup . Inoltre, poiché la ricerca produce un array, generalmente lo svolgiamo nella fase successiva. Quindi, invece di svolgerlo nella fase successiva, svolgilo all'interno della ricerca come:
{ $lookup: { from: "Collection", as: "resultingArrays", localField: "x", foreignField: "y", unwinding: { preserveNullAndEmptyArrays: false }
}}
-
Usa allowDiskUse in aggregazione, con l'aiuto di essa le operazioni di aggregazione possono scrivere dati nella sottodirectory _tmp nella directory Database Path. Viene utilizzato per eseguire la query di grandi dimensioni sulla directory temporanea. Ad esempio:
db.orders.aggregate( [ { $match: { status: "A" } }, { $group: { _id: "$uid", total: { $sum: 1 } } }, { $sort: { total: -1 } } ], { allowDiskUse: true }, )
Se crei ed elimini indici abbastanza spesso, ricostruisci i tuoi indici. Aiuta MongoDB ad aggiornare, il piano di query precedentemente memorizzato, la cache, che continua a rilevare il piano di query richiesto, credimi, quel problema fa schifo :(
Troppi indici richiedono troppo tempo nell'operazione di creazione, aggiornamento ed eliminazione poiché devono creare l'indice insieme alle loro attività. Quindi rimuoverli aiuta molto.
In uno scenario reale, il recupero dei dati completi presenti nel database non aiuta. Inoltre, o non puoi visualizzarlo o l'utente non può leggere i dati recuperati completi. Quindi, invece di recuperare i dati completi, recupera i dati in blocchi che aiutano sia te che il tuo cliente a guardare quei dati.
E infine guardare quale piano di esecuzione è selezionato da MongoDB aiuta a capire il problema principale. Quindi, $explain ti aiuterà a capirlo.
Spero che questo riassunto vi aiuti ragazzi, sentitevi liberi di suggerire nuovi punti se me ne sono persi qualcuno. Li aggiungerò anche io.