TL;DR InfluxDB 技术提示:aggregateWindow() 优化
作者:Anais Dotis-Georgiou / 用例, 开发者, 产品
2022年5月19日
导航至
如果您是 InfluxDB 用户,那么您几乎肯定使用过 aggregateWindow() 函数。aggregateWindow() 函数通过将平均值、总和或任何其他聚合函数应用于固定的时间窗口来计算聚合值。它最常用于对数据进行降采样或创建数据的物化视图。已为此函数添加了一些新的优化,使其性能更佳。
以前,aggregateWindow() 函数对于以下用户来说性能不够好:
- 正在查询大量数据
- 拥有高基数数据
- 希望在计算聚合之前将相似的序列分组在一起,以计算跨多个序列的聚合
下推模式和原生 Go
Flux 能够高效地查询数据,因为某些函数将数据转换工作负载下推到存储,而不是在内存中执行转换。执行此工作的函数组合称为下推模式。以前,只有 from() |> range() |> filter() |> aggregateWindow() 是一种下推模式。现在,from() |> range() |> filter() |> group() |> aggregateWindow() 也是一种下推模式,这意味着
- 性能更佳
- 您现在可以先对相似的序列进行分组,然后再应用 aggregateWindow() 函数,并轻松计算跨多个序列的聚合。
以前,aggregateWindow() 函数是用 Flux 编写的。现在,它已用原生 Go 针对特定函数进行了实现。此更改意味着,如果您使用 aggregateWindow() 函数来计算以下聚合,则其性能将更加出色
- 平均值
- 总和
- 计数
- (最小值和最大值预计很快推出)
请注意: 为了从 aggregateWindow() 函数中获得更高的性能,请务必将 createEmpty 选项设置为 false。createEmpty 选项默认设置为 true,这将创建空的时间窗口。
aggregateWindow() 的性能针对 50,000 个点和 50 的基数进行了测试,以下是结果
以前,from |> range |> group |> aggregateWindow 模式耗时约 508 毫秒。现在,执行时间缩短至约 200 毫秒!这大大提高了该查询的速度。
关于 aggregateWindow() 优化的最终想法
我希望这篇 InfluxDB 技术提示帖子能够启发您利用 Flux 对分组数据执行 aggregateWindow() 函数。如果您在使用 Flux 时需要帮助,请在我们的社区网站或 Slack 频道中寻求帮助。如果您正在 InfluxDB 之上开发一个很酷的物联网应用程序,我们很乐意了解,因此请务必分享您的故事!此外,请在评论区分享您的想法、疑虑或问题。我们很乐意获得您的反馈,并帮助您解决遇到的任何问题!