我正在阅读一些旧代码,我发现influxdb中的所有插入都是通过这种方式完成的(此处为简化代码):
influxDB.write(Point.measurement(myeasurement)
.time( System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.addField("myfield", 123)
.tag("rnd",String.valueOf(Math.random() * 100000)))
.build())
您可以猜测,标签“ rnd”的标签值对于每个值都是不同的,这意味着我们可以有100k个不同的标签值。实际上,目前我们的值比该值要少,所以我们最终应该为每个值使用一个不同的标签值...
我不是influxdb的专家,但我的理解是influxdb使用标签将相关值分组在一起,例如其他工具中的分区或分片。 10万个标签的值似乎很多...
这是否像我认为的那样可怕?还是这种插入物可能对某些东西有用?
编辑:我刚刚意识到Math.random()*是一个双精度型,因此* 100000只是没有用。作为String.valueOf()。实际上,每个值在数据库中都有一个系列,我无法想象这会是一件好事:(
答案 0 :(得分:1)
这是坏事,没有必要。
不必要,因为您写入influxdb的每个点都由其时间戳记和一组应用的标记值唯一标识。
不好,因为每组标记值都会创建一个单独的序列。 Influxdb会为该系列保留一个索引。每个数据点具有唯一的标记值将增加您的系统资源需求并降低数据库速度。除非您没有那么多数据点,否则您实际上就不需要时间序列数据库,或者只是不在乎。
正如OP所说。标签用于分组或过滤。
这里是有关该主题的一些好读物
https://docs.influxdata.com/influxdb/v1.7/concepts/tsi-details/
https://www.influxdata.com/blog/path-1-billion-time-series-influxdb-high-cardinality-indexing-ready-testing/
根据文档upper bound [for series or unique tag values] is usually somewhere between 1 - 4 million series depending on the machine used.
,这很容易是一天的高分辨率数据。