转载请注明出处:
1.定义:
InfluxDB 连续查询(Continuous Query)是一种自动化查询类型,该查询会根据定义的时间间隔定期运行,并将结果存储在新的目标测量中。这样的查询通常用于处理大量时间序列数据。
2.基本语法
使用语法格式:
CREATE CONTINUOUS QUERY <cq_name> ON <db_name>
BEGIN
SELECT <function>(<column>) INTO <target_measurement> FROM <source_measurement>
WHERE <time_clause> GROUP BY <tag_key>
END
其中:
<cq_name>
:为连续查询指定一个名称<db_name>
:为数据库指定一个名称<function>
:函数必须是 mean、sum、min、max 或 count 的其中之一<column>
:要执行聚合操作的列名<target_measurement>
:新创建的目标测量名称<source_measurement>
:源测量名称<time_clause>
:指定时间范围的语句,可以包含WHERE time > now() - <duration>
等<tag_key>
:可选参数,按照此 tag 进行分组操作
3.使用
在 InfluxDB 中创建连续查询可以通过以下两个步骤完成:
- 创建
到
目标测量的查询。 - 将第一步得到的查询作为连续查询的输入。
4.使用场景
采样和数据保留
使用CQ与InfluxDB的保留策略(RP)来减轻存储问题。结合CQ和RP自动将高精度数据降低到较低的精度,并从数据库中移除可分配的高精度数据。
预先计算昂贵的查询
通过使用CQ预先计算昂贵的查询来缩短查询运行时间。使用CQ自动将普通查询的高精度数据下采样到较低的精度。较低精度数据的查询需要更少的资源并且返回更快。
替换HAVING子句
InfluxQL不支持HAVING子句。通过创建CQ来聚合数据并查询CQ结果以达到应用HAVING子句相同的功能。
5.查看和删除sql
查看连续查询
SHOW CONTINUOUS QUERIES
删除连续查询:
从一个指定的database删除CQ:
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
DROP CONTINUOUS QUERY
返回一个空的结果。
修改连续查询:
根据官网的介绍,创建CQ之后,无法进行更改,如果需要更改需要drop掉之后重新create。
6.运行时间点以及覆盖的时间范围
CQ对实时数据进行操作。他们使用本地服务器的时间戳,GROUP BY time()
间隔和InfluxDB的预设时间边界来确定何时执行以及查询中涵盖的时间范围。
cq_query
的GROUP BY time()
间隔相同的间隔执行,并且它们在InfluxDB的预设时间边界开始时运行。如果GROUP BY time()
间隔为1小时,则CQ每小时开始执行一次。
now()
和now()
减去GROUP BY time()
间隔的时间范围运行单个查询。 如果GROUP BY time()
间隔为1小时,当前时间为17:00,查询的时间范围为16:00至16:59999999999。
自动采样数据
使用简单的CQ自动从单个字段中下采样数据,并将结果写入同一数据库中的另一个measurement。
CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
BEGIN
SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
END
以上示例使用数据库transportation
中的示例数据。measurementbus_data
数据存储有关公共汽车乘客数量和投诉数量的15分钟数据:
cq_basic
从bus_data
中计算乘客的平均小时数,并将结果存储在数据库transportation
中的average_passengers
中。
cq_basic
以一小时的间隔执行,与GROUP BY time()
间隔相同的间隔。 每个小时,cq_basic
运行一个单一的查询,覆盖了now()
和now()
减去GROUP BY time()
间隔之间的时间范围,即now()
和now()
之前的一个小时之间的时间范围。
7.使用示例:
假设我们有一个名为 cpu_usage
的测量,其中包含了多个 tag 和 field,我们需要将其聚合并写入一个新的测量 cpu_usage_per_hour
中。
CREATE CONTINUOUS QUERY "cq_cpu_usage" ON "mydb"
BEGIN
SELECT MEAN("value") INTO "cpu_usage_per_hour" FROM "cpu_usage"
WHERE time > now() - 1h GROUP BY time(1h), "host"
END
该连续查询会计算最近一小时内 cpu_usage
测量的平均值,并按照每小时以及 host
进行分组,结果存储在 cpu_usage_per_hour
测量中。
可以使用以下命令查看已创建的连续查询列表:
SHOW CONTINUOUS QUERIES
8.官网链接
https://docs.influxdata.com/influxdb/v1/query_language/continuous_queries/