Skip to content

写入与查询语法

InfluxDB 各代都广泛支持 Line Protocol 写入,但查询语言需要按版本选择:1.x 主要使用 InfluxQL,2.x 主推 Flux,3.x 支持 SQL 与 InfluxQL且不支持 Flux。


Line Protocol

Line Protocol 是数据格式,不是唯一的写入工具。CLI、HTTP API、Client Library 和 Telegraf 最终都可以使用 Line Protocol 向 InfluxDB 发送 Point,完整对比和配置见 数据写入方式

text
cpu,host=server01,region=cn-east usage_user=23.5,usage_system=8.2 1787212800000000000

语法由四部分构成:

text
measurement[,tag_key=tag_value...] field_key=field_value[,field...] [timestamp]

注意事项:

  • Tag 和 Field 之间以空格分隔。
  • 多个 Point 使用换行分隔,批量写入通常比逐点请求高效。
  • 整数值在 Line Protocol 中通常需要 i 后缀,避免被识别为 Float。
  • Timestamp 精度必须与 API 参数一致,错误精度可能把数据写到异常年代。
  • 对空格、逗号和等号按 Line Protocol 规则转义。

InfluxDB 3 SQL

sql
SELECT
    date_bin(INTERVAL '5 minutes', time) AS window_start,
    host,
    avg(usage_user) AS avg_usage
FROM cpu
WHERE time >= now() - INTERVAL '24 hours'
  AND region = 'cn-east'
GROUP BY 1, host
ORDER BY 1, host;

InfluxDB 3 SQL 基于 DataFusion,适合 JOIN、Window Function 和标准 SQL 工具生态。它不是 MySQL SQL 方言,时间函数、类型、系统表和 DML 能力需要按 InfluxDB SQL Reference 使用。

完整的基础查询、时间窗口、最新值、Window Function、Gap Fill、CTE 和 JOIN 示例见 InfluxDB 3 SQL 语法


InfluxQL

sql
SELECT MEAN("usage_user")
FROM "cpu"
WHERE time >= now() - 24h
  AND "region" = 'cn-east'
GROUP BY time(5m), "host" fill(null);

InfluxQL 形似 SQL,但 GROUP BY time()、Selector Function、Retention Policy 等概念是时序专用语义。InfluxDB 3 对 InfluxQL 的实现仍可能缺少旧版本的部分语句和函数,迁移前应检查 Feature Support。


Flux

text
from(bucket: "metrics")
  |> range(start: -24h)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> filter(fn: (r) => r.region == "cn-east")
  |> aggregateWindow(every: 5m, fn: mean)

Flux 通过 Pipe-Forward 组合数据处理步骤,主要属于 InfluxDB 2.x 体系。InfluxDB 3 不支持 Flux,已有 Flux Dashboard 和 Task 迁移时需要改写为 SQL、InfluxQL 或新的 Processing 机制。

Flux 的表流模型、Group Key、常用函数、Pivot、Join 和 Task 示例见 Flux 查询语法


查询原则

  • 所有生产查询都应明确时间范围。
  • 优先用 Tag/维度过滤缩小 Series 或分区。
  • 窗口聚合要明确时区、窗口边界、空窗口填充值和迟到数据。
  • 查询最近值时使用版本提供的 Selector 或 Last Value Cache,而不是无边界全表排序。
  • 使用参数化查询和 Token,避免拼接标识符与条件造成注入或越权。

参考资料