文档文档

InfluxDB 模式设计建议

InfluxDB 3 Core 处于公开 Alpha 阶段

InfluxDB 3 Core 处于公开 alpha 阶段,可用于测试和反馈,但不适用于生产环境。产品和本文档均在不断完善中。我们欢迎并鼓励您提供关于 alpha 体验的输入,并邀请您加入我们的公共频道以获取更新和分享反馈。

Alpha 预期和建议

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

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 的值为

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

表模式应是同构的

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

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

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

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

为查询简洁性而设计

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

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

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

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

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

例如,考虑以下 Line Protocol,它将多个属性(位置、型号和 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 开源版本现已发布公开 Alpha 版

InfluxDB 3 开源版本现已可用于 alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个产品作为 alpha 版本的一部分。

InfluxDB 3 Core 是我们新的开源产品。它是用于时间序列和事件数据的最新数据引擎。InfluxDB 3 Enterprise 是一个商业版本,它建立在 Core 的基础上,增加了历史查询功能、只读副本、高可用性、可扩展性和细粒度的安全性。

有关如何开始使用的更多信息,请查看