Contents

数据库-influxDB-个人笔记

官网 官方文档 go客户端文档

概念

  • 数据库(database):用户、保留策略、连续查询和时间序列数据的逻辑容器,和mysql的database是一致的
  • 字段键(field key):类比mysql无索引的表字段通常是点的数值
  • 字段集(field set):一个点上的字段健和字段值的集合
  • 字段值(field value)
  • 度量(measurement):类比于mysql的表
  • 点(point):在 InfluxDB 中,一个点代表一条数据记录,类似于 SQL 数据库表中的一行,有测量值、标签集、字段键、字段值和时间戳(timestamp)。由序列(series)和时间戳唯一标识
  • 保留策略(retention policy (RP)):描述 InfluxDB 保留数据的时间(持续时间),集群中存储多少份数据(复制因子),以及分片组覆盖的时间范围(分片组持续时间)。每个数据库的 RP 都是唯一的,并且与测量和标记集一起定义了一个序列。当您创建数据库时,InfluxDB 会创建一个称为autogen的无限持续时间的保留策略,复制因子设置为 1,分片组持续时间设置为 7 天。
  • 序列(series):与保留策略1对1关系
  • 标签键(tag key):类比mysql有索引的表字段,通常是点的维度
  • 标签集(tag set):一个点上的标签键和标签值的集合
  • 标签值(tag value)
  • 时间戳(timestamp):与点关联的日期和时间。InfluxDB 中的所有时间都是 UTC
  • shard:

词汇表

比较 InfluxDB 和 SQL 数据库:InfluxDB 类似于 SQL 数据库,但在许多方面有所不同。InfluxDB 专为时间序列数据而构建。关系数据库可以处理时间序列数据,但并未针对常见的时间序列工作负载进行优化。InfluxDB 旨在存储大量时间序列数据并快速对该数据进行实时分析。

Influx 查询语言 (InfluxQL)

InfluxQL是一种类似于 InfluxDB SQL 的查询语言,用于处理 InfluxDB 数据库中的数据,语法非常类似mysql的语法

查询语法

基础语法:

  • SELECT statement:SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]
  • WHERE clause:SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
  • GROUP BY clause:SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]
  • INTO clause:SELECT_clause INTO <measurement_name> FROM_clause [WHERE_clause] [GROUP_BY_clause],将数据写入指定的测量

配置查询结果:

  • ORDER BY time DESC:SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] ORDER BY time DESC
  • LIMIT clause:SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT <N>,限制点数目
  • SLIMIT clause:SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>,限制series数目
  • OFFSET clause:SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT_clause OFFSET <N> [SLIMIT_clause]
  • SOFFSET clause:SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(time_interval)] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] SLIMIT_clause SOFFSET <N>
  • Time Zone clause:SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause] tz('<time_zone>'),修改时区

查询语法的一般提示:

  • GROUP BY time intervals:FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]按时间分点返回结果,具体来说对于时间戳属于同一时间段的数据,将他们的time字段修改为该时间段的起始时间
  • now():当前时间,时间可以加减时间段,比如SELECT "water_level" FROM "h2o_feet" WHERE time > now() - 1h
  • 正则表达式:SELECT /l/ FROM "h2o_feet" LIMIT 1,用/扩起来的字符串,可以用在where里面=~ 为匹配!~为不匹配
  • 数据类型筛选并转换:SELECT_clause <field_key>::<type> FROM_clause, float, integer, string, or boolean
  • 聚合函数默认聚合多个series的结果:SELECT MEAN("water_level") FROM "h2o_feet"
  • 一行可以用;启动多个语句,返回一个json对象,该对象只有一个results字段,是一个json对象数组
  • 子查询:SELECT_clause FROM ( SELECT_statement ) [...]

查询数据库信息

show 和 select 无法一起使用,但是我们可以通过select count(*)和group by子句来计算tag的不同值:select count(*) from (select sum(peak) from xflow_peak where time = '2023-07-21 16:00:00' group by idc_name)

  • SHOW DATABASES:查询数据库列表,默认有NOAA_water_database和_internal数据库
  • SHOW RETENTION POLICIES [ON <database_name>]:查询数据库的策略
  • SHOW SERIES [ON <database_name>] [FROM_clause] [WHERE <tag_key> <operator> [ '<tag_value>' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]:查询时间序列信息
  • SHOW MEASUREMENTS [ON <database_name>] [WITH MEASUREMENT <operator> ['<measurement_name>' | <regular_expression>]] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]:显示表信息
  • SHOW TAG KEYS [ON <database_name>] [FROM_clause] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]:显示tag键信息
  • SHOW TAG VALUES [ON <database_name>][FROM_clause] WITH KEY [ [<operator> "<tag_key>" | <regular_expression>] | [IN ("<tag_key1>","<tag_key2")]] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]:显示tag值信息,常用的show tag values with key='xxx'
  • SHOW FIELD KEYS [ON <database_name>] [FROM <measurement_name>]:显示field的键信息
  • SHOW CARDINALITY:显示表信息的基数,常用SHOW TAG VALUES CARDINALITY WITH KEY = myTagKey

元数据并不能和where time 一起使用,show得到的结果始终是以整个数据库为准的

管理数据库

数据管理

  • CREATE DATABASE <database_name> [WITH [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [NAME <retention-policy-name>]]:创建数据库
  • DROP DATABASE <database_name>:删除数据库
  • DROP SERIES FROM <measurement_name[,measurement_name]> WHERE <tag_key>='<tag_value>':删除时间序列
  • DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]:删除点
  • DROP MEASUREMENT <measurement_name>:删除表
  • DROP SHARD <shard_id_number>:删除分区存储点时间序列

保留策略管理

  • CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]:创建保留策略
  • ALTER RETENTION POLICY <retention_policy_name> ON <database_name> [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [DEFAULT]:修改保留策略
  • DROP RETENTION POLICY <retention_policy_name> ON <database_name>:删除保留策略

连续查询

用于降采样

官网

函数

官网

运算符

因为支持正则匹配,所以对于多选的值可以使用正则匹配来多选:/^a|b|c$/匹配a或b或c

另外因为influxdb底层也是通过go开发的所以正则完全符合go标准库regexp的正则,追根溯源还是RE2标准

官网

语言参考

官网

管理数据库信息

默认最大时序数

100万

配置文件

/etc/influxdb/influxdb.conf

将一个measurement的点加入另一个measurement

1
SELECT * INTO "destinationDB"."autogen"."measurement2" FROM "sourceDB"."autogen"."measurement1" GROUP BY *

go客户端

v1 github

v1对应influxQL

v2 github

v2对应flux

InfluxDB性能高的主要原因

  • 专为时间序列数据设计:InfluxDB是为处理时间序列数据(例如监控系统的指标,物联网设备的数据等)而专门设计的,所以它在存储和查询这种类型的数据时非常高效。
  • 数据模型优化:InfluxDB的数据模型为时间序列数据的读写提供了优化。每个数据点都有一个时间戳和一系列的值,并且可以有多个可选的标签(tags)。标签被索引,使得基于标签的查询非常快。这个索引是倒排索引。
  • 列式存储:InfluxDB使用列式存储模型,使得对同一列数据的查询更加高效。列式存储也使得数据压缩更有效,因为相同类型的数据存储在一起。
  • 索引优化:InfluxDB使用了基于时间和tag的索引,这使得基于时间范围和标签的查询非常高效。
  • 自动数据清理:InfluxDB可以设置数据的生命周期策略(Retention Policy),当数据达到设定的老化时间后,InfluxDB会自动清理这些数据,保证存储的效率。
  • 内存和I/O效率:InfluxDB对于内存和I/O操作的管理进行了优化,使得其在读写大量数据时仍能保持高效的性能。
  • 数据压缩:InfluxDB对存储的数据进行了压缩,这减少了存储需求并提高了I/O效率。
 |