And*_*res 9 performance mongodb database-design query-performance performance-tuning
我的数据结构如下:
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
Run Code Online (Sandbox Code Playgroud)
我需要执行以下查询:
第一的:
date,filter_a,filter_b,filter_c和其他人其次,使用过滤后的数据:
variable_a,variable_b并variable_cvariable_a,variable_b并variable_cvariable_a,variable_b而variable_cgroup或分组数据second_group并聚合(计数、平均、标准、..)系统的用户数量大约是10或15个,但是项目的数量很大,现在是70M,但几周后将达到500M,大约一年后将达到1000M。
查询的数量很少,同时不超过10个用户,我的问题是如何处理这些具有如此庞大数据量的查询。
到目前为止我尝试了什么?
我从 开始mongodb,一开始它很快,但在用 10M+ 计算四分位数时它变得很慢。当我添加索引时,它有所改进,但当我必须查询所有数据时,它并没有太大帮助。我开始使用 mongodb 是因为数据非常动态,但幸运的是数据格式“不会再改变”。
作为filter_a和filter_b可以看到类似的节点,我试过neo4j。我非常喜欢 neo4j,但我的图有很多边,因此查询速度不是很快。
最后,由于数据格式不会改变,而且它只是一个集合/表,所以不需要在 SQL 中加入,我检查了 postgresql。我使用 postgresql 的测试速度更快,但我担心它将来无法正确扩展。
我需要什么?
编辑
谢谢!
小智 6
与其依靠关系数据库对时间序列数据执行这些统计计算,我建议您将这些数学和后处理工作从数据库中移到客户端应用程序中。
使用 Python 或 Ruby 等脚本语言,您可以通过在固定宽度的时间段内查询“数据块”,计算中间统计摘要,然后在循环时跨多个块组合结果来逐步解决问题在整个历史中。一些统计度量很难跨块组合,但像 Avg() 之类的东西每个块只需要 sum() 和 count(),O(1) 与 O(chunksize),因此块合并可以很好地扩展。