文档菜单
文档首页
/
MongoDB 手册
/

时间序列集合注意事项

本页内容

  • metaField 注意事项
  • metaField 最佳实践
  • 存储和基数
  • 粒度
  • 压缩和硬件

时间序列集合通常与普通集合类似,但有额外的例外。有关时间序列集合的行为和结构信息,请参阅时间序列集合.

AmetaField 应很少更改,可以是任何数据类型。一个 metaField 可以是一个对象,并且可以包含子字段。一旦你将一个字段定义为 metaField,你可以更改 metaField 的值,但无法将其重新定义为另一个字段。例如,如果你使用 metaField 定义为字段 A 创建时间序列文档,你无法后来将字段 B 转换为 metaField。然而,如果 A 的值是一个对象,你可以向 A 中添加新的子字段。

注意

将数组用作 metaField 可能会导致意外的集合行为,因为数组相等依赖于特定的顺序。

MongoDB 使用 metaField 来对数据进行分区,以有效地组织和检索。当你创建时间序列集合时,MongoDB 将文档分组到桶中。桶中的文档共享相同的 metaField 值,并且具有彼此接近的 timeField 值。

时间序列集合中的桶的数量取决于唯一的 metaField 值的数量。具有细粒度或动态 metaField 值的集合可能比具有简单 metaField 值(这些值很少或从不更改)的集合生成更多、稀疏填充的短期桶。细粒度和动态 metaField 值通常会降低存储和查询效率。

  • 将很少或永不更改的字段作为您的 metaField 的一部分。

  • 如果可能,选择作为过滤表达式中的常见标识符或其他稳定值作为您 metaField 的一部分。

  • 在您的metaField中,避免选择未用作过滤的字段。相反,将这些字段用作测量指标。

当您将数据插入到时间序列集合中时,内部集合会自动将数据组织成优化的存储格式,使用。如果存在合适的桶,MongoDB会将新数据插入该桶。如果不存在合适的桶,MongoDB会创建一个新桶。为了优化存储,选择很少更改的以创建具有较少、更密集的桶的时间序列集合。

具有细粒度或更改值的集合会产生许多稀疏填充、短暂存在的桶,增加集合的基数。增加基数会导致存储和查询效率降低。

您可以使用granularity参数来指定MongoDB根据数据摄入率对时间序列数据进行桶化的频率。下表显示了使用给定granularity值时,一个数据桶中包含的最大时间间隔

粒度
粒度桶限制
1小时
分钟
24小时
小时
30天

默认情况下,粒度设置为。您可以通过将粒度值设置为与来自同一数据源传入测量值的时间跨度最接近的匹配值来提高性能。例如,如果您正在记录来自数千个传感器的天气数据,但每个传感器每5分钟只记录一次数据,则将粒度设置为"分钟"。您添加新文档的频率越低,更粗糙的粒度带来的存储和性能优势就越大。

粒度设置为小时将一个月的数据摄取事件合并到单个桶中,从而导致更长的遍历时间和较慢的查询。将其设置为会导致每个轮询间隔多个桶,其中许多可能只包含单个文档。

在选择粒度值时,还应考虑典型查询。例如,如果您预期您的查询一次获取1天的数据,则使用"分钟"。更细的粒度,如"秒",会创建覆盖一小时的桶。这需要更多的桶来表示相同的数据,从而对存储和查询性能产生负面影响。更粗糙的粒度,如"小时"(跨度为30天),需要查询一次获取30天的数据,然后过滤掉大多数数据。

有关示例,请参阅为时间序列数据设置粒度。

当您向已打开或重新打开的桶中添加数据时,所有时间序列收集都使用压缩桶格式。在缓存中对时间序列数据进行压缩支持高基数工作负载,同时保持高效的查询性能。

返回

时间序列数据