假设我有一个记录大量数据的流入测量。每个点都标有一个唯一的 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 秒。
有没有更好的方法来做到这一点,而不用我可能想要过滤的所有东西标记每个点。