Skip to content

InfluxDB 常用 InfluxQL 查询

InfluxQL是InfluxDB的查询语言,用于查询、分析和管理时间序列数据。本文将详细介绍InfluxDB常用的InfluxQL查询语句,帮助用户快速掌握InfluxQL查询技巧。

基础查询

1. 查询所有数据

查询指定测量的所有数据是最基本的查询操作,适用于数据量较小的场景或需要查看完整数据结构的情况。

txt
-- 查询所有数据,不推荐用于大数据集,可能导致性能问题
SELECT * FROM "measurement_name";

-- 查询最近1小时的数据,通过时间范围限制提高查询效率
SELECT * FROM "measurement_name" WHERE time > now() - 1h;

-- 查询指定时间范围的数据,精确控制查询的数据量
SELECT * FROM "measurement_name" WHERE time >= '2023-01-01T00:00:00Z' AND time <= '2023-01-02T00:00:00Z';

2. 查询指定字段

只查询需要的字段可以大幅提高查询效率,减少网络传输和数据处理开销,是InfluxQL查询的最佳实践之一。

txt
-- 查询单个字段,获取特定指标的数据
SELECT "field_name" FROM "measurement_name";

-- 查询多个字段,同时获取多个相关指标的数据
SELECT "field1", "field2" FROM "measurement_name";

-- 查询字段并指定别名,使查询结果更易读
SELECT "field_name" AS "alias_name" FROM "measurement_name";

3. 使用标签过滤

InfluxDB的标签是索引的,使用标签过滤可以大幅提高查询效率。标签过滤是InfluxQL查询优化的重要手段。

txt
-- 单个标签过滤,根据特定标签值筛选数据
SELECT * FROM "measurement_name" WHERE "tag_name" = 'tag_value';

-- 多个标签过滤,组合多个标签条件进行精确筛选
SELECT * FROM "measurement_name" WHERE "tag1" = 'value1' AND "tag2" = 'value2';

-- 标签值包含匹配,使用正则表达式匹配标签值
SELECT * FROM "measurement_name" WHERE "tag_name" =~ /pattern/;

-- 标签值不包含匹配,使用正则表达式排除标签值
SELECT * FROM "measurement_name" WHERE "tag_name" !~ /pattern/;

4. 时间范围查询

时间序列数据的核心是时间,精确控制查询的时间范围是InfluxQL查询的基础。合理的时间范围设置可以大幅提高查询性能。

txt
-- 最近n分钟/小时/天的数据,使用相对时间表达
SELECT * FROM "measurement_name" WHERE time > now() - 30m;  -- 最近30分钟
SELECT * FROM "measurement_name" WHERE time > now() - 1h;   -- 最近1小时
SELECT * FROM "measurement_name" WHERE time > now() - 7d;   -- 最近7天

-- 特定时间点的数据,查询精确时间的数据点
SELECT * FROM "measurement_name" WHERE time = '2023-01-01T12:00:00Z';

-- 时间范围查询,使用时间戳(纳秒级)进行精确查询
SELECT * FROM "measurement_name" WHERE time >= 1672531200000000000 AND time <= 1672617600000000000;

聚合查询

1. 基本聚合函数

聚合函数用于对时间序列数据进行统计分析,是InfluxQL查询的核心功能之一。InfluxDB提供了丰富的聚合函数,满足不同场景的分析需求。

txt
-- 计算平均值,了解数据的集中趋势
SELECT mean("field_name") FROM "measurement_name";

-- 计算总和,统计数据的累积值
SELECT sum("field_name") FROM "measurement_name";

-- 计算最大值,找出数据的峰值
SELECT max("field_name") FROM "measurement_name";

-- 计算最小值,找出数据的谷值
SELECT min("field_name") FROM "measurement_name";

-- 计算数据点数量,统计数据的完整性
SELECT count("field_name") FROM "measurement_name";

-- 计算中位数,了解数据的中间水平
SELECT median("field_name") FROM "measurement_name";

-- 计算标准差,了解数据的离散程度
SELECT stddev("field_name") FROM "measurement_name";

-- 计算方差,了解数据的波动情况
SELECT variance("field_name") FROM "measurement_name";

2. 分组聚合

分组聚合是时间序列数据分析的强大工具,可以按标签或时间对数据进行分组统计,揭示数据的分布规律和变化趋势。

txt
-- 按标签分组,比较不同维度的数据
SELECT mean("field_name") FROM "measurement_name" GROUP BY "tag_name";

-- 按多个标签分组,进行多维度交叉分析
SELECT mean("field_name") FROM "measurement_name" GROUP BY "tag1", "tag2";

-- 按时间分组(每10分钟),查看数据随时间的变化趋势
SELECT mean("field_name") FROM "measurement_name" GROUP BY time(10m);

-- 按时间和标签分组,同时查看多个维度数据随时间的变化
SELECT mean("field_name") FROM "measurement_name" GROUP BY time(1h), "tag_name";

3. 窗口函数

窗口函数用于对时间序列数据进行窗口分析,如移动平均、差分计算等,是时间序列预测和异常检测的重要工具。

txt
-- 移动平均,平滑数据波动,突出长期趋势
SELECT moving_average(mean("field_name"), 10) FROM "measurement_name" GROUP BY time(1h);

-- 差分计算,查看数据的变化率
SELECT difference(mean("field_name")) FROM "measurement_name" GROUP BY time(1h);

-- 非负差分,确保差分结果非负,适用于累计值数据
SELECT non_negative_difference(mean("field_name")) FROM "measurement_name" GROUP BY time(1h);

-- 累积和,计算数据的累积值变化
SELECT cumulative_sum(mean("field_name")) FROM "measurement_name" GROUP BY time(1h);

高级查询

1. 子查询

子查询用于处理复杂的数据分析需求,可以将一个查询的结果作为另一个查询的数据源,实现多层嵌套分析。

txt
-- 子查询计算日平均值,然后计算月平均值,实现多级降采样分析
SELECT mean("daily_mean") FROM (
  SELECT mean("field_name") AS "daily_mean" 
  FROM "measurement_name" 
  GROUP BY time(1d)
) GROUP BY time(30d);

-- 子查询过滤,然后计算平均值,先筛选特定数据再进行聚合分析
SELECT mean("field_name") FROM (
  SELECT * 
  FROM "measurement_name" 
  WHERE "tag_name" = 'value'
) GROUP BY time(1h);

2. 连接查询

连接查询用于将多个测量的数据按时间进行关联,是多指标关联分析的重要工具。InfluxQL支持多种连接类型,满足不同场景的分析需求。

txt
-- 内连接,只返回两个测量中时间匹配的数据
SELECT * FROM "measurement1" INNER JOIN "measurement2" ON time;

-- 左连接,返回左侧测量的所有数据,右侧测量匹配的数据
SELECT * FROM "measurement1" LEFT JOIN "measurement2" ON time;

-- 右连接,返回右侧测量的所有数据,左侧测量匹配的数据
SELECT * FROM "measurement1" RIGHT JOIN "measurement2" ON time;

-- 全连接,返回两个测量的所有数据,时间匹配的合并显示
SELECT * FROM "measurement1" FULL OUTER JOIN "measurement2" ON time;

3. 条件查询

条件查询用于根据字段值过滤数据,实现更精确的数据筛选。需要注意的是,字段过滤不使用索引,对于大数据集可能影响查询性能。

txt
-- 字段值等于条件,筛选特定值的数据
SELECT * FROM "measurement_name" WHERE "field_name" = 100;

-- 字段值大于条件,筛选超过阈值的数据
SELECT * FROM "measurement_name" WHERE "field_name" > 100;

-- 字段值小于条件,筛选低于阈值的数据
SELECT * FROM "measurement_name" WHERE "field_name" < 100;

-- 字段值在范围内,筛选特定区间的数据
SELECT * FROM "measurement_name" WHERE "field_name" >= 0 AND "field_name" <= 100;

-- 字段值不等于条件,排除特定值的数据
SELECT * FROM "measurement_name" WHERE "field_name" != 100;

数据管理查询

1. 数据库管理

数据库管理查询用于创建、删除和切换InfluxDB数据库,是InfluxDB管理的基础操作。

txt
-- 创建数据库,初始化新的数据库环境
CREATE DATABASE "database_name";

-- 删除数据库,注意:此操作不可恢复
DROP DATABASE "database_name";

-- 显示所有数据库,查看当前InfluxDB实例中的数据库列表
SHOW DATABASES;

-- 使用数据库,切换当前操作的数据库上下文
USE "database_name";

2. 测量管理

测量管理查询用于查看和管理InfluxDB测量(类似关系数据库的表),包括查看字段、标签和删除测量等操作。

txt
-- 显示所有测量,查看当前数据库中的测量列表
SHOW MEASUREMENTS;

-- 显示测量的字段,了解测量的数据结构
SHOW FIELD KEYS FROM "measurement_name";

-- 显示测量的标签,了解测量的索引结构
SHOW TAG KEYS FROM "measurement_name";

-- 显示测量的标签值,查看标签的具体取值
SHOW TAG VALUES FROM "measurement_name" WITH KEY = "tag_name";

-- 删除测量,注意:此操作不可恢复
DROP MEASUREMENT "measurement_name";

3. 保留策略管理

保留策略(RP)用于管理InfluxDB数据的存储时间和复制策略,是InfluxDB数据生命周期管理的核心机制。

txt
-- 创建保留策略,设置数据的存储时间和复制因子
CREATE RETENTION POLICY "rp_name" ON "database_name" DURATION 30d REPLICATION 1 DEFAULT;

-- 修改保留策略,调整数据的存储时间
ALTER RETENTION POLICY "rp_name" ON "database_name" DURATION 60d;

-- 删除保留策略,注意:此操作会删除该策略下的所有数据
DROP RETENTION POLICY "rp_name" ON "database_name";

-- 显示保留策略,查看数据库的所有保留策略配置
SHOW RETENTION POLICIES ON "database_name";

4. 连续查询管理

连续查询(CQ)用于自动执行数据降采样和聚合,是InfluxDB大规模数据处理的重要机制。

txt
-- 创建连续查询,自动将数据降采样到指定保留策略
CREATE CONTINUOUS QUERY "cq_name" ON "database_name" BEGIN
  SELECT mean("field_name") INTO "rp_name"."measurement_name" 
  FROM "measurement_name" 
  GROUP BY time(1h)
END;

-- 显示连续查询,查看当前数据库中的所有连续查询
SHOW CONTINUOUS QUERIES;

-- 删除连续查询,停止自动降采样任务
DROP CONTINUOUS QUERY "cq_name" ON "database_name";

用户和权限管理

1. 用户管理

用户管理查询用于创建、修改和删除InfluxDB用户,是InfluxDB安全管理的基础操作。

txt
-- 创建用户,添加新的数据库用户
CREATE USER "username" WITH PASSWORD 'password';

-- 创建管理员用户,添加具有所有权限的管理员
CREATE USER "admin_username" WITH PASSWORD 'password' WITH ALL PRIVILEGES;

-- 修改用户密码,定期更新密码是安全最佳实践
SET PASSWORD FOR "username" = 'new_password';

-- 删除用户,移除不再需要的用户
DROP USER "username";

-- 显示所有用户,查看当前数据库中的用户列表
SHOW USERS;

2. 权限管理

权限管理查询用于授予和撤销用户权限,实现细粒度的访问控制,是InfluxDB安全管理的核心功能。

txt
-- 授予数据库只读权限,允许用户查询数据但不能写入
GRANT READ ON "database_name" TO "username";

-- 授予数据库读写权限,允许用户查询和写入数据
GRANT WRITE ON "database_name" TO "username";

-- 授予数据库所有权限,允许用户执行所有操作
GRANT ALL ON "database_name" TO "username";

-- 撤销权限,移除用户的特定权限
REVOKE ALL ON "database_name" FROM "username";

-- 显示用户权限,查看用户的当前权限配置
SHOW GRANTS FOR "username";

性能优化查询

1. 使用EXPLAIN分析查询计划

EXPLAIN命令用于分析InfluxQL查询的执行计划,帮助识别查询瓶颈,是InfluxQL查询优化的重要工具。

txt
-- 分析查询计划,查看查询的执行方式和优化建议
EXPLAIN SELECT mean("field_name") FROM "measurement_name" WHERE time > now() - 1h GROUP BY time(10m);

-- 分析查询计划,显示执行步骤和实际执行时间
EXPLAIN ANALYZE SELECT mean("field_name") FROM "measurement_name" WHERE time > now() - 1h GROUP BY time(10m);

2. 限制查询结果

限制查询结果数量可以大幅提高查询效率,减少内存使用和网络传输,是InfluxQL查询的最佳实践之一。

txt
-- 限制结果行数,只返回前100条数据
SELECT * FROM "measurement_name" LIMIT 100;

-- 限制结果行数并排序,返回最近的100条数据
SELECT * FROM "measurement_name" ORDER BY time DESC LIMIT 100;

-- 限制每个分组的结果行数,对每个分组只返回前10条数据
SELECT * FROM "measurement_name" GROUP BY "tag_name" LIMIT 10;

3. 预计算和降采样

预计算和降采样是InfluxDB大规模数据处理的核心优化手段,通过连续查询自动将高频数据降采样为低频数据,大幅提高查询性能。

txt
-- 创建降采样连续查询,将原始数据降采样为每小时聚合数据
CREATE CONTINUOUS QUERY "cq_downsample_1h" ON "database_name" BEGIN
  SELECT mean("field1") AS "mean_field1", 
         max("field2") AS "max_field2" 
  INTO "rp_30d"."measurement_name_1h" 
  FROM "measurement_name" 
  GROUP BY time(1h), "tag1", "tag2"
END;

-- 查询降采样数据,使用预计算的聚合数据提高查询效率
SELECT * FROM "rp_30d"."measurement_name_1h" WHERE time > now() - 7d;

常见查询示例

1. 服务器监控查询

服务器监控是InfluxDB的典型应用场景,通过监控CPU、内存、磁盘等指标,实时了解服务器的运行状态。

txt
-- 查询单个服务器CPU使用率趋势,了解服务器CPU的使用模式
SELECT mean("usage_idle") AS "idle", 
       mean("usage_user") AS "user", 
       mean("usage_system") AS "system" 
FROM "cpu" 
WHERE "host" = 'server01' AND time > now() - 24h 
GROUP BY time(10m);

-- 比较多个服务器CPU使用率,进行跨服务器性能对比
SELECT mean("usage_idle") AS "idle" 
FROM "cpu" 
WHERE time > now() - 1h 
GROUP BY time(5m), "host";

2. 网络监控查询

网络监控用于跟踪网络接口的流量情况,帮助识别网络瓶颈和异常流量。

txt
-- 查询网络接口流量,计算每秒的接收和发送速率
SELECT non_negative_difference(mean("bytes_recv")) AS "recv_rate", 
       non_negative_difference(mean("bytes_sent")) AS "send_rate" 
FROM "net" 
WHERE "interface" = 'eth0' AND time > now() - 1h 
GROUP BY time(1m);

-- 查询总网络流量,统计每日的网络使用总量
SELECT sum(non_negative_difference(mean("bytes_recv"))) AS "total_recv", 
       sum(non_negative_difference(mean("bytes_sent"))) AS "total_send" 
FROM "net" 
WHERE time > now() - 24h 
GROUP BY time(1h);

3. 磁盘监控查询

磁盘监控用于跟踪磁盘使用率和IO性能,帮助预测磁盘容量需求和识别IO瓶颈。

txt
-- 查询磁盘使用率,监控磁盘容量变化趋势
SELECT mean("used_percent") AS "used_percent" 
FROM "disk" 
WHERE "path" = '/' AND time > now() - 7d 
GROUP BY time(1h);

-- 查询磁盘IO,了解磁盘的读写性能
SELECT mean("read_bytes") AS "read_rate", 
       mean("write_bytes") AS "write_rate" 
FROM "diskio" 
WHERE "name" = 'sda' AND time > now() - 1h 
GROUP BY time(5m);

4. 应用监控查询

应用监控用于跟踪应用程序的性能指标,如响应时间、成功率等,帮助识别应用性能问题和优化机会。

txt
-- 查询应用平均响应时间,监控应用的响应性能
SELECT mean("response_time") AS "avg_response_time" 
FROM "app_metrics" 
WHERE "app_name" = 'webapp' AND time > now() - 24h 
GROUP BY time(10m);

-- 查询应用请求成功率,监控应用的可靠性
SELECT sum("success_count") / (sum("success_count") + sum("error_count")) * 100 AS "success_rate" 
FROM "app_metrics" 
WHERE "app_name" = 'webapp' AND time > now() - 1h 
GROUP BY time(5m);

常见问题(FAQ)

Q1: 如何提高InfluxQL查询性能?

A1: 提高查询性能的方法:

  • 缩小查询时间范围
  • 只查询需要的字段
  • 使用带索引的标签过滤
  • 避免使用SELECT *
  • 使用降采样数据查询长期趋势
  • 优化GROUP BY时间桶大小

Q2: 如何处理InfluxQL查询超时?

A2: 处理查询超时的方法:

  • 缩小查询时间范围
  • 增加查询超时时间(http.query-timeout)
  • 优化查询语句,减少数据扫描量
  • 使用降采样数据
  • 增加系统资源

Q3: 如何备份InfluxQL查询结果?

A3: 备份查询结果的方法:

  • 使用INTO子句将结果写入新的测量
  • 使用influx命令行工具导出查询结果到文件
  • 使用第三方工具如Telegraf或自定义脚本导出数据

Q4: 如何在InfluxQL中使用正则表达式?

A4: 使用正则表达式的方法:

  • 标签值匹配:WHERE "tag_name" =~ /pattern/
  • 标签值不匹配:WHERE "tag_name" !~ /pattern/
  • 测量名匹配:SELECT * FROM /^meas/
  • 字段名匹配:SELECT /^field/ FROM "measurement"

Q5: 如何在InfluxQL中进行时间差计算?

A5: 进行时间差计算的方法:

  • 使用time_diff函数:SELECT time_diff(time, '2023-01-01T00:00:00Z') FROM "measurement"
  • 使用now()函数:SELECT now() - time AS "age" FROM "measurement"
  • 使用时间窗口函数:SELECT difference(mean("field")) FROM "measurement" GROUP BY time(1h)

Q6: 如何在InfluxQL中查询空值?

A6: 查询空值的方法:

  • InfluxDB中字段值不存在即为空值
  • 使用IS NULL:SELECT * FROM "measurement" WHERE "field" IS NULL
  • 使用IS NOT NULL:SELECT * FROM "measurement" WHERE "field" IS NOT NULL

Q7: 如何在InfluxQL中排序查询结果?

A7: 排序查询结果的方法:

  • 按时间升序:SELECT * FROM "measurement" ORDER BY time ASC
  • 按时间降序:SELECT * FROM "measurement" ORDER BY time DESC
  • 按字段值排序:SELECT * FROM "measurement" ORDER BY "field" DESC

Q8: 如何在InfluxQL中使用子查询?

A8: 使用子查询的方法:

  • 将子查询作为数据源:SELECT * FROM (SELECT mean("field") FROM "measurement")
  • 嵌套子查询:SELECT * FROM (SELECT * FROM (SELECT * FROM "measurement"))
  • 子查询中使用聚合函数:SELECT mean("mean_field") FROM (SELECT mean("field") AS "mean_field" FROM "measurement")

Q9: 如何在InfluxQL中管理连续查询?

A9: 管理连续查询的方法:

  • 创建连续查询:CREATE CONTINUOUS QUERY ...
  • 显示连续查询:SHOW CONTINUOUS QUERIES
  • 删除连续查询:DROP CONTINUOUS QUERY ...
  • 检查连续查询执行情况:查看日志或监控指标

Q10: 如何在InfluxQL中查询多个测量的数据?

A10: 查询多个测量数据的方法:

  • 使用JOIN连接:SELECT * FROM "meas1" JOIN "meas2" ON time
  • 使用UNION(InfluxDB 2.0+):SELECT * FROM "meas1" UNION SELECT * FROM "meas2"
  • 分别查询,在应用层合并结果