文档文档

InfluxDB架构设计

为更简单、更高效的查询设计架构。遵循设计指南以简化架构查询。了解这些指南如何导致更高效的查询。

良好的模式设计可以防止高系列基数,从而实现更好的查询性能。如果您注意到数据读取和写入变慢,或想了解基数如何影响性能,请参阅如何解决高基数

按查询设计

以下模式演示了易于查询的测量标签键字段键

测量标签键标签键字段键字段键
airSensorsensorIdstationhumiditytemperature
waterQualitySensorsensorIdstationpHtemperature

airSensorwaterQualitySensor模式说明了以下指南:

以下点(按行协议格式化)使用airSensorwaterQualitySensor模式:

airSensor,sensorId=A0100,station=Harbor humidity=35.0658,temperature=21.667 1636729543000000000
waterQualitySensor,sensorId=W0101,station=Harbor pH=6.1,temperature=16.103 1472515200000000000

保持测量和键简单

标签值字段值中存储数据,而不是在标签键字段键测量中。如果您的模式设计为在标签和字段值中存储数据,则查询将更容易编写且更高效。

此外,您将保持基数低,因为在写入数据时不创建测量和键。要了解更多关于高系列基数性能影响的信息,请参阅如何解决高基数

比较模式

比较以下由行协议表示的有效模式。

推荐:以下模式在单独的cropplotregion标签中存储元数据。字段temp包含可变数字数据。

Good Measurements schema - Data encoded in tags (recommended)
-------------
weather_sensor,crop=blueberries,plot=1,region=north temp=50.1 1472515200000000000
weather_sensor,crop=blueberries,plot=2,region=midwest temp=49.8 1472515200000000000

不推荐:以下模式在测量中连接(blueberries.plot-1.north)存储多个属性(cropplotregion),类似于Graphite指标。

Bad Measurements schema - Data encoded in the measurement (not recommended)
-------------
blueberries.plot-1.north temp=50.1 1472515200000000000
blueberries.plot-2.midwest temp=49.8 1472515200000000000

不推荐:以下模式在字段键中连接(blueberries.plot-1.north)存储多个属性(cropplotregion)。

Bad Keys schema - Data encoded in field keys (not recommended)
-------------
weather_sensor blueberries.plot-1.north.temp=50.1 1472515200000000000
weather_sensor blueberries.plot-2.midwest.temp=49.8 1472515200000000000

比较查询

比较以下针对良好测量不良测量模式的查询。Flux查询计算北地区蓝莓的平均temp

易于查询良好测量数据可以很容易地通过region标签值进行过滤,如下例所示。

// Query *Good Measurements*, data stored in separate tags (recommended)
from(bucket:"example-bucket")
    |> range(start:2016-08-30T00:00:00Z)
    |> filter(fn: (r) =>  r._measurement == "weather_sensor" and r.region == "north" and r._field == "temp")
    |> mean()

难以查询不良测量需要正则表达式从测量中提取plotregion,如下例所示。

// Query *Bad Measurements*, data encoded in the measurement (not recommended)
from(bucket:"example-bucket")
    |> range(start:2016-08-30T00:00:00Z)
    |> filter(fn: (r) =>  r._measurement =~ /\.north$/ and r._field == "temp")
    |> mean()

复杂的测量使某些查询变得不可能。例如,使用不良测量模式计算两个图的平均温度是不可能的。

保持键简单

除了保持键中没有数据外,遵循以下额外指南以使其更容易查询

避免在键中使用关键词和特殊字符

为了简化查询编写,不要在标签和字段键中包含保留关键词或特殊字符。如果您在键中使用 Flux 关键词,那么您必须用双引号将键括起来。如果您在键中使用非字母数字字符,那么您必须在 Flux 中使用 括号表示法

避免为标签和字段使用重复的名称

避免在同一模式中为 标签键字段键 使用相同的名称。如果您有一个具有相同名称的标签和字段,则查询结果可能不可预测。

使用标签和字段

标签值 已索引,而 字段值 未索引。这意味着查询标签的性能比查询字段更高。您的查询应指导您在标签中存储什么以及在字段中存储什么。

使用字段存储唯一和数值数据

  • 将唯一或经常更改的值存储为字段值。
  • 将数值存储为字段值。(标签 只存储字符串)。

使用标签提高查询性能

  • 如果值可以合理索引,则将其存储为标签值。
  • 如果值在 filter()group() 函数中使用,则将其存储为标签值。
  • 如果值在多个数据点之间共享,即字段的元数据,则将其存储为标签值。

由于 InfluxDB 索引标签,查询引擎不需要扫描桶中的每个记录来定位标签值。例如,考虑一个存储有关成千上万名用户数据的桶。如果将 userId 存储在 字段 中,则查询用户 abcde 要求 InfluxDB 在每一行中扫描 userId

from(bucket: "example-bucket")
    |> range(start: -7d)
    |> filter(fn: (r) => r._field == "userId" and r._value == "abcde")

为了更快地检索数据,请对标签进行筛选以减少扫描的行数。该标签应存储可以合理索引的数据。以下查询通过 company 标签进行筛选,以减少对 userId 的扫描行数。

from(bucket: "example-bucket")
    |> range(start: -7d)
    |> filter(fn: (r) => r.company == "Acme")
    |> filter(fn: (r) => r._field == "userId" and r._value == "abcde")

保持标签简单

为每个数据属性使用一个标签。如果您的源数据在单个参数中包含多个数据属性,则将每个属性拆分为自己的标签。当每个标签代表您数据的一个属性(而不是多个连接的属性)时,您将减少查询中正则表达式的需要。没有正则表达式,您的查询将更容易编写且性能更高。

比较模式

比较以下由行协议表示的有效模式。

推荐:以下模式将位置数据拆分为 plotregion 标签。

Good Tags schema - Data encoded in multiple tags
-------------
weather_sensor,crop=blueberries,plot=1,region=north temp=50.1 1472515200000000000
weather_sensor,crop=blueberries,plot=2,region=midwest temp=49.8 1472515200000000000

不推荐:以下模式将多个属性(plotregion)连接到 location 标签值中(plot-1.north)。

Bad Tags schema - Multiple data encoded in a single tag
-------------
weather_sensor,crop=blueberries,location=plot-1.north temp=50.1 1472515200000000000
weather_sensor,crop=blueberries,location=plot-2.midwest temp=49.8 1472515200000000000

比较查询

比较 Good TagsBad Tags 模式的查询。以下 Flux 查询计算 north 地区的蓝莓的平均 temp

易于查询:如以下示例所示,Good Tags 数据可以通过 region 标签值轻松筛选。

// Query *Good Tags* schema, data encoded in multiple tags
from(bucket:"example-bucket")
    |> range(start:2016-08-30T00:00:00Z)
    |> filter(fn: (r) =>  r._measurement == "weather_sensor" and r.region == "north" and r._field == "temp")
    |> mean()

难以查询Bad Tags 需要正则表达式来解析复杂的 location 值,如以下示例所示。

// Query *Bad Tags* schema, multiple data encoded in a single tag
from(bucket:"example-bucket")
    |> range(start:2016-08-30T00:00:00Z)
    |> filter(fn: (r) =>  r._measurement == "weather_sensor" and r.location =~ /\.north$/ and r._field == "temp")
    |> mean()

有关 InfluxDB 数据模型的概述,请观看以下视频


这个页面有帮助吗?

感谢您的反馈!


Flux的未来

Flux将进入维护模式。您无需对代码进行任何更改,可以继续按当前方式使用它。

阅读更多

InfluxDB v3增强功能和InfluxDB Clustered现已正式发布

新功能,包括更快的查询性能和管理工具,推动了InfluxDB v3产品线的进步。InfluxDB Clustered现已正式发布。

InfluxDB v3性能和功能

InfluxDB v3产品线在查询性能方面取得了显著提升,并提供了新的管理工具。这些增强包括用于监控InfluxDB集群健康状况的操作仪表板,InfluxDB云专用的单点登录(SSO)支持,以及用于令牌和数据库的新管理API。

了解新的v3增强功能


InfluxDB Clustered正式发布

InfluxDB Clustered现已正式发布,为您在自管理堆栈中提供InfluxDB v3的力量。

与我们谈谈InfluxDB Clustered