InfluxDB语法差异
InfluxDB syntactic difference
这两种形式有区别吗?
myMetric value1=1,value2=2
还有这个
myMetric.value1 v=1
myMetric.value2 v=2
两者存储相同的数据(两个点)。显然,它们可以通过不同的方式访问,但我的意思是在存储、性能等方面有什么不同吗?根据 this talk,第一个被转换为第二个,至少在语义上是这样。
根据流入线协议的流入文档:
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
您的第一个表单将一条记录插入到没有标签的测量 myMetric
中,两个字段 (value1
、value2
) 的值分别为 1
和 2
。由于数据中未提供时间戳,因此服务器时间戳将用于数据点。
在第二种情况下,您正在创建两个单独的测量:myMetric.value1
和 myMetric.value2
每个都有一个名为 v
的字段,其值分别为 1
和 2
.考虑到默认的纳秒精度,它们的时间戳也可能不同。
所以,这两种情况并不等同。
使用 influx
cli 工具,这些情况如下所示:
> INSERT myMetric value1=1,value2=2
> show measurements
name: measurements
name
----
myMetric
> show field keys from myMetric
name: myMetric
fieldKey fieldType
-------- ---------
value1 float
value2 float
> select * from myMetric
name: myMetric
time value1 value2
---- ------ ------
1526032578114702408 1 2
对于第二种情况:
> INSERT myMetric.value1 v=1
> INSERT myMetric.value2 v=2
> show measurements
name: measurements
name
----
myMetric.value1
myMetric.value2
> select * from "myMetric.value1"
name: myMetric.value1
time v
---- -
1526032859752277164 1
> select * from "myMetric.value2"
name: myMetric.value2
time v
---- -
1526032864711858673 2
正如您在案例 1 中看到的,您有 1 个插入操作插入到一个测量中,用于一个数据点,其中包含两个字段。在情况 2 中,有两个插入操作到两个不同的测量值中,每个测量值都有一个字段。
因此,如果在您的用例中 value1 和 value2 通常一起插入,我希望第一个变体的性能更高。情况 2 将需要对相同数据进行 2 次插入。存储使用量可能大致相同。
如果 value1 和 value2 是独立插入的并且在不同的时间插入,则情况 2 在存储方面可能更有效一些,因为它不必为 (null,2)
或 (1,null)
等数据点存储空值.
在单独的测量中也有数据字段还有另一个缺点:
查询如:
> select value1, value2,value2-value1 from myMetric
name: myMetric
time value1 value2 value2_value1
---- ------ ------ -------------
1526032578114702408 1 2 1
在第二种情况下是不可能的。
这两种形式有区别吗?
myMetric value1=1,value2=2
还有这个
myMetric.value1 v=1
myMetric.value2 v=2
两者存储相同的数据(两个点)。显然,它们可以通过不同的方式访问,但我的意思是在存储、性能等方面有什么不同吗?根据 this talk,第一个被转换为第二个,至少在语义上是这样。
根据流入线协议的流入文档:
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
您的第一个表单将一条记录插入到没有标签的测量 myMetric
中,两个字段 (value1
、value2
) 的值分别为 1
和 2
。由于数据中未提供时间戳,因此服务器时间戳将用于数据点。
在第二种情况下,您正在创建两个单独的测量:myMetric.value1
和 myMetric.value2
每个都有一个名为 v
的字段,其值分别为 1
和 2
.考虑到默认的纳秒精度,它们的时间戳也可能不同。
所以,这两种情况并不等同。
使用 influx
cli 工具,这些情况如下所示:
> INSERT myMetric value1=1,value2=2
> show measurements
name: measurements
name
----
myMetric
> show field keys from myMetric
name: myMetric
fieldKey fieldType
-------- ---------
value1 float
value2 float
> select * from myMetric
name: myMetric
time value1 value2
---- ------ ------
1526032578114702408 1 2
对于第二种情况:
> INSERT myMetric.value1 v=1
> INSERT myMetric.value2 v=2
> show measurements
name: measurements
name
----
myMetric.value1
myMetric.value2
> select * from "myMetric.value1"
name: myMetric.value1
time v
---- -
1526032859752277164 1
> select * from "myMetric.value2"
name: myMetric.value2
time v
---- -
1526032864711858673 2
正如您在案例 1 中看到的,您有 1 个插入操作插入到一个测量中,用于一个数据点,其中包含两个字段。在情况 2 中,有两个插入操作到两个不同的测量值中,每个测量值都有一个字段。
因此,如果在您的用例中 value1 和 value2 通常一起插入,我希望第一个变体的性能更高。情况 2 将需要对相同数据进行 2 次插入。存储使用量可能大致相同。
如果 value1 和 value2 是独立插入的并且在不同的时间插入,则情况 2 在存储方面可能更有效一些,因为它不必为 (null,2)
或 (1,null)
等数据点存储空值.
在单独的测量中也有数据字段还有另一个缺点: 查询如:
> select value1, value2,value2-value1 from myMetric
name: myMetric
time value1 value2 value2_value1
---- ------ ------ -------------
1526032578114702408 1 2 1
在第二种情况下是不可能的。