Die Struktur meiner Daten ist wie folgt:
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
Ich muss die folgenden Abfragen durchführen:
Zuerst:
- Filtern von Daten durch
date
,filter_a
,filter_b
,filter_c
und andere
Zweitens mit den gefilterten Daten:
- Zähle alle Datensätze
- erhalten Durchschnitt von
variable_a
,variable_b
undvariable_c
- bekommen Standardabweichung von
variable_a
,variable_b
undvariable_c
- Holen Sie sich Quartile von
variable_a
,variable_b
undvariable_c
- Gruppendaten nach
group
odersecond_group
und aggregieren (Count, Avg, Std, ..)
Die Zahl der Benutzer des Systems ist etwa 10 oder 15, aber die Anzahl der Elemente ist sehr groß, gerade jetzt ist es 70M aber es wird 500M in ein paar Wochen , und es wird 1000M in etwa ein Jahr.
Die Anzahl der Abfragen ist gering, nicht mehr als 10 Benutzer gleichzeitig. Mein Problem ist, wie diese Abfragen mit dieser riesigen Datenmenge behandelt werden.
Was habe ich bisher versucht?
Ich begann mit
mongodb
, am Anfang war es schnell, aber es wurde langsam, wenn Quartile mit 10M + berechnet wurden. Es hat sich verbessert, als ich Indizes hinzugefügt habe, aber es hat nicht viel geholfen, als ich alle Daten abfragen musste. Ich habe angefangen, Mongodb zu verwenden, weil die Daten sehr dynamisch waren, aber zum Glück wird sich das Datenformat "nicht mehr ändern".Da
filter_a
undfilter_b
wie Knoten gesehen werden konnte, habe ich es versuchtneo4j
. Ich mochte es neo4j sehr, aber mein Diagramm hatte viele Kanten, so dass Abfragen nicht sehr schnell waren.Da sich das Datenformat nicht ändert und es sich nur um eine Sammlung / Tabelle handelt und daher keine Verknüpfungen in SQL erforderlich sind, habe ich postgresql überprüft. Meine Tests mit postgresql waren schneller, aber ich fürchte, es könnte in Zukunft nicht richtig skaliert werden.
Was brauche ich?
- Ist postgresql eine gute Wahl für diesen Fall?
- Gibt es eine andere Art von Datenbank, die ich verwenden könnte? Welches ist das beste für diesen Fall?
- Was könnte ich noch tun, um es zu verbessern?
Bearbeiten
- Täglich werden etwa 1 Million Elemente eingefügt, die sich im Laufe der Zeit nicht ändern sollten.
- Die Schreibgeschwindigkeit ist nicht wichtig
- Die schwierige Anforderung besteht darin, schnell zu lesen / zu aggregieren
Vielen Dank!