TL;DR InfluxDB 技术技巧 - 查询标签值、跨度量查询数据、理解时间戳
作者 Regan Kuchan / 开发者
2016年6月16日
导航到
在这篇文章中,我们回顾了本周最有趣的 InfluxDB 和 TICK-stack 相关问题、解决方案、教程和问答,这些内容可能被您错过了,包括来自 GitHub、IRC 和 InfluxDB Google Group 的内容。
跨度量查询数据
问题: 我有两个度量:cow_groups
和 cow_activity
。我想在 cow_groups
中按标签进行 GROUP BY
,并计算 cow_activity
中字段的平均值。
我的数据组织如下
> SELECT * FROM cow_groups
name: cow_groups
----------------
time cow_group_id cow_id value
2016-06-12T23:10:00Z consistent producer 3 1
2016-06-12T23:10:00Z food motivated 2 1
2016-06-12T23:10:00Z food motivated 1 1
2016-06-12T23:10:00Z cool kids 1 1
> SELECT * FROM cow_activity
name: cow_activity
------------------
time cow_id grass_consump milk_prod
2016-06-12T23:10:00Z 1 10 60
2016-06-12T23:10:00Z 3 9 70
2016-06-12T23:10:00Z 2 7 71
我知道 InfluxDB 不支持 JOIN
,但有没有什么方法可以执行类似以下查询的操作?
SELECT mean("milk_prod") FROM "cow_activity" GROUP BY "cow_groups"."cow_group_id"
答案: 您说得对。InfluxDB 0.9+ 不支持 JOIN
。相反,给定度量中的所有系列都自动合并,除非在 WHERE
子句或 GROUP BY
子句中通过显式过滤器区分。
无法执行跨度量数学或分组。所有数据都必须位于单个度量中才能一起查询。我们建议重新组织您的 模式,以便所有数据都位于单个度量中。InfluxDB 不是关系型数据库,并且跨度量映射数据不是一种很好的模式。
推荐模式(cow_group_id
和 cow_id
是标签)
> SELECT * FROM "cows"
name: cows
----------
time cow_group_id cow_id grass_consump milk_prod
2016-06-12T23:10:00Z consistent producer 3 9 70
2016-06-12T23:10:00Z food motivated 2 7 71
2016-06-12T23:10:00Z food motivated 1 10 60
2016-06-12T23:10:00Z cool kids 1 10 60
# That schema makes this query possible:
> SELECT mean("milk_prod") FROM "cows" GROUP BY "cow_group_id"
name: cows
tags: cow_group_id=consistent producer
time mean
---- ----
1970-01-01T00:00:00Z 70
name: cows
tags: cow_group_id=cool kids
time mean
---- ----
1970-01-01T00:00:00Z 60
name: cows
tags: cow_group_id=food motivated
time mean
---- ----
1970-01-01T00:00:00Z 65.5
查询标签值
问题: 我已经成功将几个点写入数据库,并且简单的 SELECT *
查询工作正常,但当我指定 WHERE
子句中的标签时,我没有得到任何结果。我遗漏了什么?
> INSERT farm,patch_id=1 blueberries=15 1465948800000000000
> INSERT farm,patch_id=2 blueberries=32 1465948800000000000
> INSERT farm,patch_id=1 blueberries=12 1465952400000000000
> SELECT * FROM "farm"
name: farm
----------
time blueberries patch_id
2016-06-15T00:00:00Z 15 1
2016-06-15T00:00:00Z 32 2
2016-06-15T01:00:00Z 12 1
> SELECT * FROM "farm" WHERE time <= now() + 5h and "patch_id"=1
> SELECT * FROM "farm" WHERE time <= now() + 5h and "patch_id"="1"
>
答案: 请在 WHERE
子句中使用单引号指定标签值:
> SELECT * FROM "farm" WHERE "patch_id"='1'
name: farm
----------
time blueberries patch_id
2016-06-15T00:00:00Z 15 1
2016-06-15T01:00:00Z 12 1
理解 GROUP BY time() 查询返回的时间戳
问题: 我的查询有一个 20 分钟的 GROUP BY time()
时间间隔,并在 WHERE
子句中指定了 20 分钟的时间范围。有趣的是,我得到了两个时间间隔的结果,而不是一个。这是怎么回事?
> SELECT max("cookies") FROM "my_kitchen" WHERE time >= '2016-06-14T15:30:00Z' and time <= '2016-06-14T15:40:00Z' GROUP BY time(20m)
name: my_kitchen
----------------
time max
2016-06-14T15:20:00Z 20
2016-06-14T15:40:00Z 18
答案: 您得到两个结果是因为 InfluxDB 处理 GROUP BY time()
查询中的时间边界的方式。
默认情况下,InfluxDB 返回四舍五入的日历时间边界。在您的例子中,InfluxDB 自动将 2016-06-14T15:20:00Z
和 2016-06-14T15:30:00Z
作为第一个 20 分钟间隔,并将 2016-06-14T15:40:00Z
和 2016-06-14T15:50:00Z
作为下一个 20 分钟间隔。请注意,max
列中的结果仅考虑在 WHERE
子句中的时间范围内。
您可以通过在GROUP BY time()
子句中包含一个偏移量间隔来更改默认的圆角日历时间边界。以下查询告诉InfluxDB将默认时间边界增加十分钟,使结果从2016-06-14T15:20:00Z
开始,而不是从2016-06-14T15:30:00Z
开始:
> SELECT max("cookies") FROM "my_kitchen" WHERE time >= '2016-06-14T15:30:00Z' and time <= '2016-06-14T15:40:00Z' GROUP BY time(20m,10m)
name: my_kitchen
----------------
time max
2016-06-14T15:30:00Z 20
请查看数据探索以获取有关偏移量间隔的文档。
有关更多InfluxDB技巧,请查看我们的常见问题解答页面,并在InfluxDB用户组中自由提问。
接下来是什么?
- 下载 并 开始使用InfluxDB v1.0 Beta
- 安排与解决方案架构师进行免费的20分钟咨询,以审查您的InfluxDB项目
- 参加我们免费的虚拟培训研讨会。
- 在您的基础设施上寻找InfluxDB集群?联系销售 以获取InfluxDB企业版演示和定价信息。