一、基本概念
InfluxDB 是一款开源的分布式时序数据库,采用 Go 语言编写。在 InfluxDB 中,数据被组织为不同的时间序列(time series),每个时间序列由一个时间戳和一个或多个键值对组成。
时间戳表示数据被写入数据库的时间,通常使用 Unix 时间戳表示。键值对分别表示数据的标签(tag)和数值(field)。标签用于标识数据,而字段则表示数据本身的数值。每个时间序列由唯一的时间戳和标签组成,字段则可以有多个。
二、数据结构
InfluxDB 中有三种数据结构:database,measurement 和 field。database 表示数据库,measurement 表示一组有关系的时间序列,而 field 则是一条时间序列中的一个键值对。
在 InfluxDB 中,数据库用于存储不同的时间序列,一个数据库可以包含多个 measurement。每个 measurement 是由标签、字段和时间戳组成的数据集合,标签用于标识数据,字段则表示数据本身的数值,时间戳表示数据的写入时间。
在 measurement 中,标签和字段是必须的,每个 measurement 至少有一个标签和一个字段。例如,在存储气象数据时,可以将气象站 ID 作为标签,温度和湿度作为字段。
三、查询语法
InfluxDB 支持多种查询方法,包括 SELECT、SHOW 和 DROP 等语句。
1. SELECT 语句
SELECT 语句用于从数据库中查询数据。
SELECT [DISTINCT] [*|field_key|function()| ] FROM [WHERE =' ' [AND =' ']] [GROUP BY ] [ORDER BY time DESC|ASC] [LIMIT ]| [OFFSET ]]
SELECT 语句中,FROM 关键字后面需要指定要查询的 measurement 名称。WHERE 关键字用于对数据进行过滤,可以针对标签和时间进行过滤。GROUP BY 关键字根据指定的标签,对查询结果进行分组,time 列默认是一种特殊的标签,可以通过 GROUP BY time(
以下是一个例子:
SELECT mean("temperature") AS "mean_temperature" FROM "weather" WHERE "location"='beijing' AND time >= now() - 1d group by time(10m)
该语句使用了 mean 函数对 temperature 字段进行平均值计算,并针对 location='beijing' ,在过去一天内查询每隔 10 分钟的平均气温。
2. SHOW 语句
SHOW 语句用于显示数据库、measurement、字段等对象的信息。
SHOW [DATABASES|FIELD KEYS|TAG KEYS|MEASUREMENTS []]
以下是一个例子:
SHOW MEASUREMENTS ON "mydb"
该语句显示 mydb 数据库中的所有 measurement 名称。
3. DROP 语句
DROP 语句用于删除 InfluxDB 中的数据、measurement 和数据库等对象。
DROP[, ] FROM
以下是一个例子:
DROP SERIES FROM "weather" WHERE "location"='beijing'
该语句删除 weather 数据库中,location='beijing' 的数据。
四、批量写入数据
InfluxDB 支持批量写入数据,提高了写入效率。
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary ' cpu,host=server01,region=us-west value=0.64 1434067467000000000 cpu,host=server02,region=us-west value=0.63 1434067467000000000 cpu,host=server03,region=us-west value=0.65 1434067467000000000 '
该语句将三条数据分别写入 cpu 表格中,其中 host 和 region 是标签,value 是字段,1434067467000000000是时间戳。
五、高级特性
1. InfluxQL Functions
InfluxDB 支持多种函数,包括聚合函数、数学函数、字符串函数等。
SELECT COUNT("temperature"), MEAN("humidity") FROM "weather" WHERE time <= now() - 1h GROUP BY time(10m) fill(0)
该语句使用 COUNT 和 MEAN 函数计算出每隔10分钟的气温数量和平均湿度,并将结果填充为 0。
2. InfluxDB 持续查询
InfluxDB 允许用户创建持续查询,以定期执行 SELECT 语句。
CREATE CONTINUOUS QUERYON BEGIN SELECT mean("temperature") AS "mean_temperature" INTO "rollup_5m_temperature" FROM "weather" GROUP BY time(5m), "location" END
该语句创建了一个名为 rollup_5m_temperature 的 measurement,每隔5分钟,将10分钟内的气温数据进行平均值计算,并按照 location 进行分组。
六、总结
InfluxDB 是一款优秀的时序数据库,支持灵活的数据结构和多种查询方法,支持批量写入和持续查询,使用时需要根据实际需求选择适当的语法进行操作。