3. InfluxDB 核心概念

InfluxDB 的数据模型与关系型数据库差异很大。关系型数据库以“库—表—行—列”组织数据,而 InfluxDB 以“库—测量—标签集—字段集—时间戳”组织数据。理解 database、measurement、tag、field、timestamp、point、series 这七个概念及其关系,是后续写入、查询、优化和排障的基础。本节将逐层拆解这些概念,并用一张结构关系图把它们串起来。

一、从写入一行数据说起

在 InfluxDB 中,最常用的写入方式是行协议(Line Protocol)。一条典型的行协议如下:

temperature,device_id=dev01,line=lineA,workshop=ws01 value=36.5,status="normal" 1717200000000000000

这条数据可以拆成四段:

  • measurement:temperature,表示测量名称,类似“表名”,描述被采集的物理量或业务对象。
  • tag set:device_id=dev01,line=lineA,workshop=ws01,标签集,用于标识数据来源和维度,是索引字段。
  • field set:value=36.5,status="normal",字段集,保存真正的测量值,不建索引。
  • timestamp:1717200000000000000,纳秒级时间戳,表示数据发生的时刻。

这四部分组合起来,就构成一个 point(数据点)。point 是 InfluxDB 写入和存储的最小单元,可以理解为“某个测量对象在某个时刻的一条记录”。

二、七个核心概念的含义与关系

下面用一张结构关系图展示七个概念之间的层级与组成关系。图中从 database 向下逐层展开,最终落到 point 与 series。

InfluxDB 数据模型:从 database 到 series database(数据库) measurement(测量) point(数据点) tag set(标签集) device_id / line / workshop field set(字段集) value / status timestamp(时间戳) 纳秒精度时刻 series(序列) measurement + tag set 的唯一组合 关系要点 • tag 建索引,field 不建索引 • point = tag + field + time • series 由 measurement 与 tag set 共同决定 示例 series temperature,device_id=dev01, line=lineA,workshop=ws01 → 一条独立时间线 → 按时间追加 point

三、逐层理解:database 与 measurement

database 是最高层容器,用于隔离不同业务、不同环境或不同租户的数据。InfluxDB 1.x 中还有 retention policy(保留策略),与 database 一起决定数据的保留时长和副本数;InfluxDB 2.x 及以后用 bucket 替代 database + retention policy 的组合。无论版本如何,database/bucket 都是命名空间和权限边界。

measurement 是 database 内的逻辑分组,类似关系型数据库中的表。它通常对应一类被采集的对象,例如 temperature、motor_vibration、power_consumption。measurement 本身不定义固定 schema,写入时动态确定 tag 和 field 集合,这也是 InfluxDB 灵活但也容易失控的地方。

四、tag 与 field:索引与非索引的分工

tag 和 field 是 point 的两个组成部分,但职责完全不同:

对比项 tag field
作用 标识数据来源与维度,用于过滤、分组 保存实际测量值,用于计算、聚合
索引 默认建索引,查询快 不建索引,全扫描代价高
数据类型 只能是字符串 支持 float、integer、string、boolean
典型示例 device_id、line、workshop、region value、status、temperature、current
高基数风险 高基数 tag 会膨胀 series 数量 高基数 field 不影响 series 数量
判断一个字段该做 tag 还是 field,可以问两个问题:它是否用于 WHERE 过滤或 GROUP BY 分组?它的取值是否有限且稳定?如果都是“是”,优先做 tag;否则做 field。

五、timestamp、point 与 series

timestamp 是 point 的时间坐标,默认精度为纳秒。InfluxDB 按时间分区存储,时间戳决定了数据落在哪个 shard 或 TSM 文件中。写入时如果不带时间戳,服务端会用当前时间补齐;但工业场景建议由采集端显式提供时间戳,避免网络延迟导致时间错位。

point 是写入的最小单元,由 measurement、tag set、field set、timestamp 四要素构成。同一个 series 上可以不断追加 point,形成一条按时间排列的数据序列。

series 是 InfluxDB 中非常关键的概念:它由 measurement 和 tag set 的唯一组合决定。换句话说,只要 measurement 相同、tag set 完全相同,这些 point 就属于同一条 series;tag set 中任意一个 tag 值变化,就会产生新的 series。series 的数量直接决定索引规模,是 InfluxDB 性能与内存占用的核心指标。

六、案例:一条产线数据的完整映射

假设某工厂采集注塑机温度,写入如下行协议:

temperature,device_id=inj01,line=lineA,workshop=ws01 value=198.6,status="running" 1717200000000000000
temperature,device_id=inj01,line=lineA,workshop=ws01 value=199.1,status="running" 1717200060000000000
temperature,device_id=inj02,line=lineA,workshop=ws01 value=201.3,status="running" 1717200000000000000

映射关系如下:

  • database:factory,整个工厂的时序数据容器。
  • measurement:temperature,温度测量。
  • tag set:device_id=inj01,line=lineA,workshop=ws01,标识设备、产线、车间。
  • field set:value=198.6,status="running",温度值和运行状态。
  • timestamp:1717200000000000000,采集时刻。
  • point:上述四要素组成的一条记录。
  • series:temperature,device_id=inj01,line=lineA,workshop=ws01 是一条 series;inj02 则属于另一条 series。

七、常见误区与复盘

误区一:把高基数字段当 tag。例如把 order_id、session_id、trace_id 设为 tag,会导致 series 数量爆炸,索引内存飙升,写入和查询都变慢。这类字段应作为 field 存储,或先做聚合再写入。

误区二:认为 measurement 有固定 schema。InfluxDB 允许同一 measurement 下不同 point 拥有不同 tag 和 field。这带来灵活性,也容易造成字段类型冲突。例如同一 field 先写整数后写字符串,会触发类型冲突错误。工程上应通过写入规范约束 field 类型。

误区三:忽略 series 基数评估。上线前应估算 series 数量:measurement 数 × 各 tag 取值组合数。若估算结果达到百万级,需要重新设计 tag 方案,减少组合维度或拆分 measurement。

复盘时可以记住一条主线:database 管隔离,measurement 管分类,tag 管索引维度,field 管测量值,timestamp 管时间坐标,point 是写入单元,series 是索引与存储的核心单位。把这七个概念的关系理清,后续的写入优化、查询设计和容量规划都会顺畅很多。