0

假设我有一个记录大量数据的流入测量。每个点都标有一个唯一的 id,用于标识数据的来源和类型。

进入此测量的示例:

data,id=source1,type=temperature value=25
data,id=source1,type=battery value=80
data,id=source2,type=temperature value=22
data,id=source2,type=battery value=86

除此之外,我还有一个 SQL 数据库,其中包含有关每个来源的详细信息。像位置、当前状态等,我想根据这个其他数据库中的信息过滤 InfluxDB 中的数据。所以我获取了一个与我的过滤器匹配的 id 列表,然后我可以将其用于我的通量查询。这个列表的长度可以是数千。

我目前基于此列表进行过滤的解决方案是使用contains()函数:

from(bucket: "my-bucket")
|> range(start: -24h, stop: now())
|> filter(fn: (r) => 
    r._measurement == "data" and 
    r.type == "temperature" and 
    contains(value: r.id, set: ["source1","source2", ...])
  )
|> ...

这个查询变得非常慢,大约 1000 个 id 查询大约需要 30 秒才能完成。如果我删除包含过滤器并立即查看所有源,则查询大约需要 1 秒。

有没有更好的方法来做到这一点,而不用我可能想要过滤的所有东西标记每个点。

4

0 回答 0