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

L'aggregazione di MongoDB sembra molto lenta

Come già accennato da @Blakes Seven, $group non può utilizzare gli indici. Vedi questo argomento .

Pertanto, la tua query è già ottimale. Un possibile modo per ottimizzare questo caso d'uso consiste nel precalcolare e rendere persistenti i dati in una raccolta laterale.

Potresti provare questa struttura di dati:

{
  "_id" : ObjectId("560a5139b56a71ea60890201"),
  "ccy" : "USDNOK",
  "date_time_first" : ISODate("2007-01-01T00:00:07.904Z"),
  "date_time_last" : ISODate("2007-09-09T00:00:07.904Z")
}

È possibile eseguire query in millisecondi anziché in oltre 500 secondi e puoi trarre vantaggio dagli indici.

Quindi, ovviamente, ogni volta che aggiungi, aggiorni o elimini un documento dalla raccolta principale, dovrai aggiornare la raccolta secondaria.

A seconda di quanto hai bisogno che i dati siano "freschi", potresti anche scegliere di saltare questo "processo di aggiornamento in tempo reale" e rigenerare completamente la raccolta secondaria solo una volta al giorno con un batch e tenere presente che i tuoi dati potrebbero non essere " fresco".

Un altro problema che potresti risolvere:il tuo server ha sicuramente bisogno di più RAM e CPU. Il tuo set di lavoro probabilmente non si adatta alla RAM, specialmente con questo tipo di aggregazioni.

Inoltre, probabilmente puoi fare buon uso di un SSD e lo farei FORTEMENTE consiglia di utilizzare un Replicaset a 3 nodi invece di una singola istanza per la produzione.