La structure de mes données est la suivante:
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
J'ai besoin d'effectuer les requêtes suivantes:
Première:
- Filtrer les données par
date
,filter_a
,filter_b
,filter_c
et d' autres
Deuxièmement, avec les données filtrées:
- compter tous les enregistrements
- obtenir la moyenne de
variable_a
,variable_b
etvariable_c
- obtenir l' écart-type de
variable_a
,variable_b
etvariable_c
- obtenir des quartiles de
variable_a
,variable_b
etvariable_c
- regrouper les données par
group
ousecond_group
et agréger (Count, Avg, Std, ..)
Le nombre des utilisateurs du système est d' environ 10 ou 15, mais le nombre d'éléments est énorme, il est en ce moment 70M mais il sera 500M dans quelques semaines et il sera 1000M dans environ un an.
Le nombre de requêtes est petit, pas plus de 10 utilisateurs simultanément, mon problème est de savoir comment gérer ces requêtes avec cette énorme quantité de données.
Qu'est-ce que j'ai essayé jusqu'à présent?
J'ai commencé par
mongodb
, au début c'était rapide mais ça devenait lent lors du calcul des quartiles avec 10M +. Cela s'est amélioré lorsque j'ai ajouté des index, mais cela n'a pas beaucoup aidé lorsque j'ai dû interroger toutes les données. J'ai commencé à utiliser mongodb car les données étaient très dynamiques mais heureusement le format des données "ne va plus changer".Comme
filter_a
etfilter_b
pourrait être vu comme des noeuds, j'ai essayéneo4j
. Je l'ai beaucoup aimé neo4j mais mon graphique avait BEAUCOUP d'arêtes pour que les requêtes ne soient pas très rapides.Enfin, comme le format des données ne changera pas et qu'il ne s'agit que d'une seule collection / table, il ne nécessite donc aucune jointure dans SQL, j'ai vérifié postgresql. Mes tests ont été plus rapides avec postgresql, mais j'ai peur qu'il ne puisse pas évoluer correctement à l'avenir.
De quoi ai-je besoin?
- Le postgresql est-il un bon choix pour ce cas?
- Y a-t-il un autre type de base de données que je pourrais utiliser? lequel est le meilleur pour ce cas?
- Que pouvais-je faire d'autre pour l'améliorer?
Éditer
- Environ 1 million d'éléments sont insérés chaque jour et «ne devraient pas changer» au fil du temps.
- La vitesse d'écriture n'est pas importante
- L'exigence difficile est de lire / agréger rapidement
Merci!