了解如何在 InfluxDB 中的字段和标签之间进行选择

Dan*_*scu 14 schema influx-db time-series-database

在设计InfluxDB 模式时,如何在字段和标签中存储数据之间进行选择有哪些好的规则和示例?

到目前为止发现的是:

随时间变化的测量应该是一个字段,关于测量的元数据应该在标签中

标签和字段实际上是表中的列。标记已编入索引,字段未编入索引

高度变异且通常不属于 WHERE 子句的值被放入字段中

如果您打算将数据与 InfluxQL 函数一起使用,则将数据存储在字段中

包含高度可变信息(如 UUID、哈希和随机字符串)的标签将导致数据库中出现大量系列,通俗地称为高系列基数。高系列基数是许多数据库工作负载高内存使用率的主要驱动因素。

但是,假设您在电子商务应用程序中存储已填写的订单:订单 ID、销售价格、货币。

  • 订单 ID 应该是标签还是字段?
  • 货币应该是标签还是字段?

小智 7

我刚刚读了一个教程,说字段是数据,标签是元数据。这是一个非常直观的定义。

该示例具有压力温度场以及气象站标签。再次,晶莹剔透,与描述完美匹配。

不幸的是,他们接着说,如果您要查询压力温度而不是气象站,则应该翻转字段标记名称。换句话说,为fieldtag提供的定义是没有意义的。

简单的解决方案是规定字段可以被索引,也可以不被索引。被索引的字段称为标签。当您需要索引字段时使用标记(例如显着提高查询速度)。


0x2*_*207 5

我建议订单和货币都是标签。因为您可能需要进行查询,例如 WHERE order = orderid 或 WHERE currency =currencyid。在这种情况下,将订单和货币作为标签具有优势,因为它们将被隐式索引。

一般来说,首先写下你的应用程序将在数据库上运行的所有查询,然后你会看到应该是什么标签


Jos*_*osh 5

标签是用于离散值集的索引字符串值。标签可以在子句中查询WHERE,并且可以用于对值进行分组GROUP BY。标签对于元数据来说是理想的选择,对于数据来说却是一个糟糕的选择。如果您需要此类功能并且您有一组有限的标记值,请使用标记。

字段是类型化的值(可以是字符串,但也可以是 int、long、bool 或任何其他有效的字段类型)并且用于数据。字段没有索引,可以选择作为结果中的列。使用数据字段。

要在标签和字段之间进行选择,请使用以下问题:

  1. 该数据是否有一组小的、有界的、离散的值?

    如果是这样,可能会使用标签。

  2. 我是否需要在 WHERE 子句中对这些数据进行分组或查询?

    如果是这样,请参阅#1:该数据是否有一组小的、有界的、离散的值?

    如果该值是无界的(例如示例中的订单 ID),则找到某种方法来标记有关该值的元数据并将该值存储为标签。订单的示例是下订单的月份(12 个离散值),尽管这对于查找给定订单显然没有那么有用。

  3. 如果您对 1 和 2 的回答为“否”,请使用字段。

在您的示例中,货币应该是一个标签(具有一组离散的值,是元数据),订单 ID 应该是一个字段(不是一组有界的值,是数据而不是元数据)

请注意,虽然订单 ID 似乎需要一个标签才能找到特定订单的数据,但这将导致 InfluxDB 中的系列基数极高,并导致非常高(不可持续的高)内存使用量。InfluxDB 旨在按时间可视化数据,而不是按订单 ID 等 ID 可视化,因此除了可以通过主键/ ID 查询的第二个数据库(例如 MySQL、Postgresql 或 NoSQL 替代方案)之外,可能还需要使用它。