TL;DR InfluxDB 技术提示:aggregateWindow() 优化

导航至

如果您是 InfluxDB 用户,那么您几乎肯定使用过 aggregateWindow() 函数。aggregateWindow() 函数通过将平均值、总和或任何其他聚合函数应用于固定的时间窗口来计算聚合值。它最常用于对数据进行降采样或创建数据的物化视图。已为此函数添加了一些新的优化,使其性能更佳。

以前,aggregateWindow() 函数对于以下用户来说性能不够好:

  • 正在查询大量数据
  • 拥有高基数数据
  • 希望在计算聚合之前将相似的序列分组在一起,以计算跨多个序列的聚合

下推模式和原生 Go

Flux 能够高效地查询数据,因为某些函数将数据转换工作负载下推到存储,而不是在内存中执行转换。执行此工作的函数组合称为下推模式。以前,只有 from() |> range() |> filter() |> aggregateWindow() 是一种下推模式。现在,from() |> range() |> filter() |> group() |> aggregateWindow() 也是一种下推模式,这意味着

  1. 性能更佳
  2. 您现在可以先对相似的序列进行分组,然后再应用 aggregateWindow() 函数,并轻松计算跨多个序列的聚合。

以前,aggregateWindow() 函数是用 Flux 编写的。现在,它已用原生 Go 针对特定函数进行了实现。此更改意味着,如果您使用 aggregateWindow() 函数来计算以下聚合,则其性能将更加出色

  • 平均值
  • 总和
  • 计数
  • (最小值和最大值预计很快推出)

请注意: 为了从 aggregateWindow() 函数中获得更高的性能,请务必将 createEmpty 选项设置为 false。createEmpty 选项默认设置为 true,这将创建空的时间窗口。

aggregateWindow() 的性能针对 50,000 个点和 50 的基数进行了测试,以下是结果

The performance of aggregateWindow()

以前,from |> range |> group |> aggregateWindow 模式耗时约 508 毫秒。现在,执行时间缩短至约 200 毫秒!这大大提高了该查询的速度。

关于 aggregateWindow() 优化的最终想法

我希望这篇 InfluxDB 技术提示帖子能够启发您利用 Flux 对分组数据执行 aggregateWindow() 函数。如果您在使用 Flux 时需要帮助,请在我们的社区网站Slack 频道中寻求帮助。如果您正在 InfluxDB 之上开发一个很酷的物联网应用程序,我们很乐意了解,因此请务必分享您的故事!此外,请在评论区分享您的想法、疑虑或问题。我们很乐意获得您的反馈,并帮助您解决遇到的任何问题!