如何处理5亿+项的查询

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)

我需要执行以下查询:

第一的:

  • 通过筛选数据datefilter_afilter_bfilter_c和其他人

其次,使用过滤后的数据:

  • 计算所有记录
  • 得到平均variable_avariable_bvariable_c
  • 得到标准差variable_avariable_bvariable_c
  • 拿到四分位数variable_avariable_bvariable_c
  • group或分组数据second_group并聚合(计数、平均、标准、..)

系统的用户数量大约是10或15个,但是项目的数量很大,现在是70M,但几周后将达到500M,大约一年后将达到1000M

查询的数量很少,同时不超过10个用户,我的问题是如何处理这些具有如此庞大数据量的查询。

到目前为止我尝试了什么?

  • 我从 开始mongodb,一开始它很快,但在用 10M+ 计算四分位数时它变得很慢。当我添加索引时,它有所改进,但当我必须查询所有数据时,它并没有太大帮助。我开始使用 mongodb 是因为数据非常动态,但幸运的是数据格式“不会再改变”。

  • 作为filter_afilter_b可以看到类似的节点,我试过neo4j。我非常喜欢 neo4j,但我的图有很多边,因此查询速度不是很快。

  • 最后,由于数据格式不会改变,而且它只是一个集合/表,所以不需要在 SQL 中加入,我检查了 postgresql。我使用 postgresql 的测试速度更快,但我担心它将来无法正确扩展。

我需要什么?

  • 对于这种情况,postgresql 是一个不错的选择吗?
  • 我可以使用另一种数据库吗?哪一种最适合这种情况?
  • 我还能做些什么来改进它?

编辑

  • 每天大约有 1M 的元素被插入,并且随着时间的推移“不应该改变”。
  • 写入速度并不重要
  • 硬性要求是快速读取/聚合

谢谢!

小智 6

与其依靠关系数据库对时间序列数据执行这些统计计算,我建议您将这些数学和后处理工作从数据库中移到客户端应用程序中。

使用 Python 或 Ruby 等脚本语言,您可以通过在固定宽度的时间段内查询“数据块”,计算中间统计摘要,然后在循环时跨多个块组合结果来逐步解决问题在整个历史中。一些统计度量很难跨块组合,但像 Avg() 之类的东西每个块只需要 sum() 和 count(),O(1) 与 O(chunksize),因此块合并可以很好地扩展。