InfluxQL 是什么
InfluxQL 是 InfluxDB 1.x 的 SQL 风格查询语言,也是 2.x 兼容层提供的查询方式。它保留了时序特有语法:时间范围用 time 条件表达,按时间窗口聚合用 GROUP BY time(interval),缺失窗口用 fill() 补值,标签维度直接写在 GROUP BY 里。理解这三点就能读懂绝大多数 InfluxQL 查询。
基本信息
| 基本结构 | SELECT 函数("字段") FROM "表" WHERE time > now() - 1h GROUP BY time(5m), "标签" |
|---|---|
| 常用函数 | mean、sum、max、min、count、percentile、derivative、non_negative_derivative、integral |
| 补值方式 | fill(null|0|previous|linear),具体支持程度以版本文档为准 |
| 时区处理 | 时间边界默认按 UTC 计算,展示时区用 tz('Asia/Shanghai') |
| 元数据查询 | SHOW MEASUREMENTS / SHOW TAG KEYS / SHOW FIELD KEYS |
| 适用版本 | InfluxDB 1.x 原生;2.x 通过兼容查询接口提供,语法以官方兼容说明为准 |
典型使用场景
- 按时间窗口看趋势:监控指标按 5 分钟或 1 小时求均值
- 按标签维度分组对比:同一指标按主机、区域或集群拆分看
- 补零展示:前端图表需要连续时间点,用 fill(0) 或 fill(null) 保证间隔均匀
- 速率与增量:用 derivative 从累计计数器得到每秒速率
- 降采样落库:把原始精度的数据按月聚合成低精度数据,用 INTO 写回另一个测量
- 定位数据是否存在:先查 SHOW MEASUREMENTS 与时间范围,再写具体查询
示例
示例
SELECT mean("usage") AS cpu
FROM "cpu"
WHERE time > now() - 6h AND "host" = 'web-1' -- 时间范围与标签过滤
GROUP BY time(5m), "region" -- 时间窗口 + 标签维度
fill(null) -- 空窗口不补零,前端按 null 断点处理
tz('Asia/Shanghai'); -- 按本地时区返回时间戳
-- 先看有哪些测量与标签,避免凭记忆写错名字
SHOW MEASUREMENTS LIMIT 20;
SHOW TAG KEYS FROM "cpu";
-- 累计计数器求速率(每秒变化量),负值截断为不输出
SELECT non_negative_derivative(mean("net_bytes"), 1s) FROM "net" WHERE time > now() - 1h GROUP BY time(1m);函数与语法读法
| 写法 | 含义 | 易错点 |
|---|---|---|
| GROUP BY time(5m) | 按 5 分钟窗口聚合 | 窗口起点是整点对齐,不是查询起始时间 |
| fill(0) | 空窗口补 0 | 会掩盖真实缺数据,展示前想清楚是否需要 |
| fill(null) | 空窗口留空 | 图表按断点渲染,需前后端约定 |
| derivative / non_negative_derivative | 求相邻窗口差值(速率) | 对非累计值使用会得到无意义结果 |
| percentile("latency", 95) | 百分位统计 | 窗口内样本过少时结果波动大 |
| SELECT ... INTO | 把结果写入另一个测量或保留策略 | 需确认目标库与 RP 的写入权限与命名 |
未聚合的字段必须出现在 GROUP BY 中,否则报错或语义不符合预期;标签(tag)与字段(field)在查询里的写法都是双引号,但只有标签能用于 GROUP BY 分组。
迁移到 2.x 前先验证查询兼容性:数据模型的标签与字段映射、INTO 写入、部分函数在不同版本上行为有差异,按官方兼容说明逐条对照测试。