连续查询做什么
连续查询(CQ)是 InfluxDB 1.x 内置的自动降采样机制:按固定时间窗口对原始数据做聚合,把结果写入另一个测量或另一个保留策略。它由数据库自身按窗口调度,不依赖外部脚本,是实现「高精度短期保留 + 低精度长期保留」的标准做法,通常与多个保留策略配合使用。
基本信息
| 适用版本 | InfluxDB 1.x(2.x 的任务机制取代了该能力) |
|---|---|
| 语法 | CREATE CONTINUOUS QUERY "cq" ON "db" BEGIN SELECT … INTO … FROM … GROUP BY time(…), * END |
| 重算窗口 | RESAMPLE EVERY <间隔> FOR <时长> 可控制执行频率与回算范围 |
| 查看 | SHOW CONTINUOUS QUERIES |
| 删除 | DROP CONTINUOUS QUERY "cq" ON "db" |
| 调度方式 | 由数据库按时间窗口自动运行,无需外部定时任务 |
典型使用场景
- 分层保留:原始数据保留数天,聚合结果保留数月至数年
- 固定报表口径:把小时级或天级均值固化成稳定的查询目标
- 降低查询压力:大范围趋势查询直接读聚合表,不再扫描原始数据
- 配合降精度策略:不同精度写入不同保留策略,过期清理互不影响
- 口径集中维护:聚合逻辑写在 CQ 里,避免各系统各自实现一遍
创建与查看
创建与查看
CREATE CONTINUOUS QUERY "cq_cpu_hourly" ON "metrics"
BEGIN
SELECT mean("usage") AS usage
INTO "metrics"."rp_2y"."cpu_hourly" -- 目标必须是不同测量或不同保留策略
FROM "cpu"
GROUP BY time(1h), * -- GROUP BY time 是 CQ 的核心,* 保留全部标签维度
END
SHOW CONTINUOUS QUERIES;
-- 启用前的历史数据不会自动进入聚合表,需要手工回补一次
-- SELECT mean("usage") INTO "metrics"."rp_2y"."cpu_hourly" FROM "cpu"
-- WHERE time < now() - 1h GROUP BY time(1h), *关键要素读法
| 要素 | 含义 | 注意点 |
|---|---|---|
| GROUP BY time(1h) | 聚合窗口 | 必须存在,否则 CQ 无法按窗口运行 |
| GROUP BY …, * | 保留全部标签维度 | 漏掉 * 会把多维数据压成一维 |
| INTO 目标 | 写入位置 | 与源同名同策略会自读自写,必须指明不同的策略或测量 |
| RESAMPLE | 执行频率与回算范围 | 回算过短会漏掉迟到数据,过长会重复计算 |
| 创建时间 | 只影响之后的新数据 | 历史数据必须显式回补 |
CQ 与保留策略是配套使用的:短期策略存原始精度、长期策略存聚合结果,只建一个长期策略而不配搬运任务,长期策略里不会有任何数据。
启用 CQ 前先做一次历史回补并核对聚合结果:否则报表会出现「新数据有、旧数据缺」的断层,且不会有任何报错提示。