TL;DR InfluxDB技术技巧:aggregateWindow()函数的优化

导航至

如果您是InfluxDB用户,您几乎肯定使用过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 上开发酷炫的 IoT 应用程序,我们很想听听,所以请确保分享您的经历!另外,请在评论区分享您的想法、担忧或问题。我们很高兴收到您的反馈并帮助您解决遇到的问题!