La struttura dei miei dati è la seguente:
date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important
Devo eseguire le seguenti query:
Primo:
- Filtrare i dati di
date
,filter_a
,filter_b
,filter_c
e altri
In secondo luogo, con i dati filtrati:
- contare tutti i record
- ottenere media di
variable_a
,variable_b
evariable_c
- ottenere la deviazione standard di
variable_a
,variable_b
evariable_c
- ottenere quartili di
variable_a
,variable_b
evariable_c
- raggruppare i dati per
group
osecond_group
e aggregare (Count, Avg, Std, ..)
Il numero di utenti del sistema è di circa 10 o 15, ma il numero di articoli è enorme, al momento è di 70 M ma sarà di 500 M in un paio di settimane e sarà di 1000 M in circa un anno.
Il numero di query è piccolo, non più di 10 utenti contemporaneamente, il mio problema è come gestire quelle query con questa enorme quantità di dati.
Cosa ho provato finora?
Ho iniziato con
mongodb
, all'inizio è stato veloce ma è diventato lento nel calcolo dei quartili con 10M +. È migliorato quando ho aggiunto gli indici, ma non ha aiutato molto quando ho dovuto interrogare tutti i dati. Ho iniziato a usare mongodb perché i dati erano molto dinamici, ma per fortuna il formato dei dati "non cambierà più".Come
filter_a
efilter_b
potrebbe essere visto come un nodo, ho provatoneo4j
. Neo4j mi è piaciuto molto, ma il mio grafico aveva MOLTI bordi, quindi le query non erano molto veloci.Infine, poiché il formato dei dati non cambierà ed è solo una raccolta / tabella, quindi non ha bisogno di unirsi in SQL, ho controllato postgresql. I miei test sono stati più veloci con postgresql, ma ho paura che non possa ridimensionarsi correttamente in futuro.
Di cosa ho bisogno?
- Postgresql è una buona scelta per questo caso?
- Esiste un altro tipo di database che potrei usare? qual è il migliore per questo caso?
- Cos'altro potrei fare per migliorarlo?
modificare
- Circa 1 milione di elementi vengono inseriti ogni giorno e "non devono cambiare" nel tempo.
- La velocità di scrittura non è importante
- Il difficile requisito è leggere / aggregare velocemente
Grazie!