InfluxDB 全语法指南
InfluxDB 是一个开源的时间序列数据库,专门用于处理高写入和查询负载。以下是 InfluxDB 的主要语法和功能概述。
1. 数据库管理
创建数据库
sql
CREATE DATABASE <database_name> [WITH [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [NAME <retention-policy-name>]]
删除数据库
sql
DROP DATABASE <database_name>
显示数据库
sql
SHOW DATABASES
2. 保留策略(Retention Policy)管理
创建保留策略
sql
CREATE RETENTION POLICY <rp_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
修改保留策略
sql
ALTER RETENTION POLICY <rp_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
删除保留策略
sql
DROP RETENTION POLICY <rp_name> ON <database_name>
显示保留策略
sql
SHOW RETENTION POLICIES [ON <database_name>]
3. 数据写入
行协议(Line Protocol)格式
xml
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
示例写入
sql
INSERT cpu,host=serverA,region=us_west value=0.64
INSERT temperature,machine=unit42,type=assembly external=25,internal=37 1434055562000000000
4. 数据查询(SELECT)
基本查询
sql
SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]
条件查询
sql
SELECT * FROM "cpu_load" WHERE "region" = 'us-west' AND time > now() - 1h
分组查询
sql
SELECT MEAN("value") FROM "cpu" GROUP BY "host", time(1h) fill(0)
聚合函数
sql
SELECT COUNT("value") FROM "cpu"
SELECT MEAN("value") FROM "cpu" WHERE time > now() - 1h GROUP BY time(10m)
5. 连续查询(Continuous Queries)
创建连续查询
sql
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
BEGIN
SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]
END
删除连续查询
sql
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
显示连续查询
sql
SHOW CONTINUOUS QUERIES
6. 用户管理
创建用户
sql
CREATE USER <username> WITH PASSWORD '<password>' [WITH ALL PRIVILEGES]
授予权限
sql
GRANT ALL PRIVILEGES TO <username>
GRANT [READ|WRITE|ALL] ON <database_name> TO <username>
撤销权限
sql
REVOKE ALL PRIVILEGES FROM <username>
REVOKE [READ|WRITE|ALL] ON <database_name> FROM <username>
删除用户
sql
DROP USER <username>
显示用户
sql
SHOW USERS
7. 特殊查询
SHOW 系列
sql
SHOW SERIES [ON <database_name>] [FROM <measurement_name>] [WHERE <tag_key> <operator> [ '<tag_value>' | <regular_expression>]] [LIMIT <N>] [OFFSET <N>]
SHOW 测量值
sql
SHOW MEASUREMENTS [ON <database_name>] [WITH MEASUREMENT <operator> ['<measurement_name>' | <regular_expression>]] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT <N>] [OFFSET <N>]
SHOW 标签键
sql
SHOW TAG KEYS [ON <database_name>] [FROM <measurement_name>] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT <N>] [OFFSET <N>]
SHOW 标签值
sql
SHOW TAG VALUES [ON <database_name>] [FROM <measurement_name>] WITH KEY [ [<operator> "<tag_key>" | <regular_expression>] | [IN ("<tag_key1>","<tag_key2")]] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT <N>] [OFFSET <N>]
SHOW 字段键
sql
SHOW FIELD KEYS [ON <database_name>] [FROM <measurement_name>]
8. 时间语法
InfluxDB 支持多种时间格式:
-
相对时间:
sqlSELECT "value" FROM "cpu" WHERE time > now() - 1h
-
绝对时间(RFC3339):
sqlSELECT "value" FROM "cpu" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T12:00:00Z'
-
时间戳(epoch):
sqlSELECT "value" FROM "cpu" WHERE time >= 1439563077s AND time <= 1439563080s
9. 函数
聚合函数
- COUNT()
- DISTINCT()
- INTEGRAL()
- MEAN()
- MEDIAN()
- MODE()
- SPREAD()
- STDDEV()
- SUM()
选择函数
- BOTTOM()
- FIRST()
- LAST()
- MAX()
- MIN()
- PERCENTILE()
- SAMPLE()
- TOP()
转换函数
- DERIVATIVE()
- DIFFERENCE()
- ELAPSED()
- NON_NEGATIVE_DERIVATIVE()
预测函数
- HOLT_WINTERS()
10. 数学运算
InfluxQL 支持基本数学运算:
sql
SELECT ("field1" + "field2") / "field3" FROM "measurement"
11. 正则表达式
在 WHERE 子句中使用正则表达式:
sql
SELECT * FROM /.*/ LIMIT 1
SELECT * FROM "cpu" WHERE "host" =~ /server[1-5]/
SELECT * FROM "cpu" WHERE "host" !~ /server[1-5]/
12. 子查询
sql
SELECT MEAN("derivative") FROM (SELECT DERIVATIVE(MEAN("value")) FROM "cpu" GROUP BY "host", time(1h)) GROUP BY time(1h)
13. 数据删除
删除序列
sql
DROP SERIES FROM <measurement_name> WHERE <tag_key>='<tag_value>'
删除测量值
sql
DROP MEASUREMENT <measurement_name>
删除数据点
sql
DELETE FROM <measurement_name> WHERE <tag_key>='<tag_value>' AND time < '2015-01-01'
14. InfluxDB 2.x 的 Flux 语法
InfluxDB 2.x 引入了 Flux 查询语言:
基本查询
flux
from(bucket: "example-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_system")
聚合
flux
from(bucket: "example-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu")
|> mean()
分组
flux
from(bucket: "example-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu")
|> group(columns: ["host"])
|> mean()
数学运算
flux
from(bucket: "example-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu")
|> map(fn: (r) => ({ r with _value: r._value * 100 }))
连接数据
flux
cpu = from(bucket: "example-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu")
mem = from(bucket: "example-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "mem")
join(tables: {cpu: cpu, mem: mem}, on: ["_time", "host"])
以上是 InfluxDB 的主要语法概述。根据您使用的版本(1.x 或 2.x),语法可能有所不同。1.x 主要使用 InfluxQL,而 2.x 引入了 Flux 作为主要查询语言。