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