文档文档

InfluxDB 模式设计建议

使用以下指南来设计您的 模式,以便进行更简单和更高性能的查询。

InfluxDB 数据结构

InfluxDB 3 Core 数据模型将时间序列数据组织到数据库和表中。一个数据库可以包含多个表。表包含多个标签和字段。

  • 数据库:一个命名的位置,用于存储时间序列数据。在 InfluxDB 3 Core 中,数据库 与 InfluxDB Cloud Serverless 和 InfluxDB TSM 实现中的 bucket 同义。

    一个数据库可以包含多个

    • :时间序列数据的逻辑分组。在 InfluxDB 3 Core 中, 与 InfluxDB Cloud Serverless 和 InfluxDB TSM 实现中的 measurement 同义。给定表中的所有应具有相同的标签。一个表包含多个标签字段
      • 标签:键值对,用于存储每个点的元数据字符串值——例如,标识或区分数据源或上下文的值——例如,主机、位置、站点等。标签值可以为空。
      • 字段:键值对,用于存储每个点的数据——例如,温度、压力、股票价格等。字段值可以为空,但任何给定行上至少有一个字段值不为空。
      • 时间戳:与数据关联的时间戳。当存储在磁盘上并进行查询时,所有数据都按时间排序。在 InfluxDB 中,时间戳是以纳秒级 Unix 时间戳 表示的 UTC 时间。时间戳永远不为空。

bucket 和 measurement 发生了什么变化?

如果您来自早期版本的 InfluxDB、InfluxDB Cloud (TSM) 或 InfluxDB Cloud Serverless,您可能熟悉 bucketmeasurement 的概念

  • InfluxDB v2 或 InfluxDB Cloud Serverless 中的 Bucket 与 InfluxDB 3 Core 中的 数据库 同义。
  • InfluxDB v1、v2 或 InfluxDB Cloud Serverless 中的 Measurement 与 InfluxDB 3 Core 中的 同义。

主键

在时间序列数据中,数据行的主键通常是时间戳和其他唯一标识每个数据点的属性的组合。在 InfluxDB 3 Core 中,行的主键是点的时间戳和标签集(点的 标签键标签值 的集合)的组合。行的主键标签集不包括具有空值的标签。

标签与字段

在为 InfluxDB 设计模式时,一个常见的问题是,“什么是应该作为标签,什么是应该作为字段?” 以下指南应有助于您在设计模式时回答该问题。

  • 使用标签存储关于数据来源或上下文的元数据或识别信息。
  • 使用字段存储测量值。
  • 标签值只能是字符串。
  • 字段值可以是以下任何数据类型
    • 整数
    • 无符号整数
    • 浮点数
    • 字符串
    • 布尔值

InfluxDB 3 存储引擎支持无限的标签值和序列基数。与以前版本的 InfluxDB 不同,标签值 基数不会影响数据库的整体性能。


模式限制

不要对标签和字段使用重复的名称

在同一表中对标签和字段使用唯一的名称。InfluxDB 3 Core 将标签和字段作为表中的唯一列存储。如果您尝试写入包含具有相同名称的标签或字段的表,则由于列冲突,写入将失败。

每个表的最大列数

一个表具有 最大列数。每行必须包含一个时间列。因此,一个表可以具有以下内容

  • 一个时间列
  • 字段和标签列,最多达到配置的最大值

如果您尝试写入表并超过列数限制,则写入请求将失败,并且 InfluxDB 将返回错误。

InfluxData 将 列数限制 确定为维护系统性能和稳定性的安全限制。超过此阈值可能会导致 宽模式,这可能会对性能和资源使用产生负面影响,具体取决于您的查询、模式的形状以及模式中的数据类型。


为性能而设计

您在表中构建模式的方式会影响资源使用和针对该表进行查询的性能。

以下指南有助于优化查询性能

避免宽模式

宽模式是指具有大量列(标签和字段)的模式。

宽模式可能导致以下问题

  • 在摄取期间持久化数据时,资源使用量增加。
  • 由于具有 过多标签 的复杂主键,排序性能降低。
  • 选择过多列时,查询性能降低

为了防止宽模式问题,请限制存储在表中的标签和字段的数量。如果您需要存储超过 最大列数,请考虑将您的字段分段到单独的表中。

避免过多标签

在 InfluxDB 3 Core 中,行的主键是点的时间戳和标签集(点的 标签键标签值 的集合)的组合。包含更多标签的点具有更复杂的主键,如果您使用键的所有部分进行排序,这可能会影响排序性能。

避免稀疏模式

稀疏模式是指在许多行中,列包含空值的模式。

这些通常源于以下原因

稀疏模式要求 InfluxDB 查询引擎评估许多空列,从而为存储和查询数据增加不必要的开销。

有关稀疏模式的示例,请 查看下面的非同质模式示例

使用不同的时间戳写入单个字段

在不同的时间使用不同的时间戳报告字段会创建包含空值的不同行——例如

您使用 tagset 报告 fieldA,然后使用相同的 tagset 但使用不同的时间戳报告 field B。结果是两行:一行 field A 的值为,另一行 field B 的值为

相反,如果您在使用相同的标签集和时间戳在不同的时间报告字段,则现有行将被更新。这在摄取时需要稍微更多的资源,但随后在持久化时间或压缩时间得到解决,并避免了稀疏模式。

表模式应是同质的

存储在表中的数据应该是“同质的”,这意味着每行应具有相同的标签和字段键。存储在表中的所有行共享相同的列,但是如果一个点不包含列的值,则列的值为。充满值的表具有 “稀疏”模式

查看稀疏的非同质模式示例

为您的数据使用最佳数据类型

在将数据写入字段时,为您的数据使用最合适的 数据类型——将整数写为整数,将小数写为浮点数,将布尔值写为布尔值。针对存储整数的字段的查询性能优于针对字符串数据的查询;查询许多长字符串值可能会对性能产生负面影响。

为查询简洁性而设计

表、标签键和字段键的命名约定可以简化或复杂化为您的数据编写查询的过程。以下指南有助于确保为您的数据编写查询尽可能简单。

保持表名、标签和字段简单

为每个数据属性使用一个标签或一个字段。如果您的源数据在一个参数中包含多个数据属性,请将每个属性拆分为其自己的标签或字段。

表名、标签键和字段键应简单明了,并准确描述每个键包含的内容。保持名称中不包含数据。复杂的命名约定最常见的原因是当您尝试将数据属性“嵌入”到表名、标签键或字段键中时。

当每个键和值代表数据的一个属性(而不是多个连接的属性)时,您将减少在查询中使用正则表达式的需求。没有正则表达式,您的查询将更易于编写且性能更高。

例如,考虑以下 行协议,该协议将多个属性(位置、型号和 ID)嵌入到 sensor 标签值中

home,sensor=loc-kitchen.model-A612.id-1726ZA temp=72.1
home,sensor=loc-bath.model-A612.id-2635YB temp=71.8

查看写入的数据

要查询 ID 为 1726ZA 的传感器的数据,您必须使用 SQL 模式匹配或正则表达式来评估 sensor 标签

SELECT * FROM home WHERE sensor LIKE '%id-1726ZA%'
SELECT * FROM home WHERE sensor =~ /id-1726ZA/

SQL 模式匹配和正则表达式都会使查询复杂化,并且性能不如简单的等式表达式。

更好的方法是将每个传感器属性作为单独的标签写入

home,location=kitchen,sensor_model=A612,sensor_id=1726ZA temp=72.1
home,location=bath,sensor_model=A612,sensor_id=2635YB temp=71.8

查看写入的数据

要使用此模式查询 ID 为 1726ZA 的传感器的数据,您可以使用简单的等式表达式

SELECT * FROM home WHERE sensor_id = '1726ZA'

此查询更易于编写,并且比使用模式匹配或正则表达式性能更高。

避免关键字和特殊字符

为了简化查询编写,请避免在表名、标签键和字段键中使用保留关键字或特殊字符。

当使用 SQL 或 InfluxQL 查询具有特殊字符或关键字的表、标签和字段时,您必须将这些标识符用双引号括起来。

SELECT
  "example-field", "tag@1-23"
FROM
  "example-table"
WHERE
  "tag@1-23" = 'ABC'

此页是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像现在一样使用它,而无需对您的代码进行任何更改。

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、最近数据引擎,可实时收集和处理数据,并将其持久保存到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、读取副本、增强的安全性以及数据压缩,以实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看