一、基本概念
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(<field_key>)|<tag_key>]
FROM <measurement_name>
[WHERE <tag_key>='<tag_value>' [AND <tag_key>='<tag_value>']]
[GROUP BY <tag_key>]
[ORDER BY time DESC|ASC]
[LIMIT <num_results>]
[OFFSET <offset_result>]
SELECT 语句中,FROM 关键字后面需要指定要查询的 measurement 名称。WHERE 关键字用于对数据进行过滤,可以针对标签和时间进行过滤。GROUP BY 关键字根据指定的标签,对查询结果进行分组,time 列默认是一种特殊的标签,可以通过 GROUP BY time(<time_interval>)
对数据进行按时间间隔分组。
以下是一个例子:
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 [<db_name>]]
以下是一个例子:
SHOW MEASUREMENTS ON "mydb"
该语句显示 mydb 数据库中的所有 measurement 名称。
3. DROP 语句
DROP 语句用于删除 InfluxDB 中的数据、measurement 和数据库等对象。
DROP <series>[, <series>] FROM <database_name>
以下是一个例子:
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 QUERY <query_name> ON <database_name>
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 是一款优秀的时序数据库,支持灵活的数据结构和多种查询方法,支持批量写入和持续查询,使用时需要根据实际需求选择适当的语法进行操作。