Docs 菜单
Docs 主页
/
MongoDB Manual
/

时间序列集合注意事项

在此页面上

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

时间序列集合的行为通常与普通集合相同,但也有一些例外情况。有关时间序列集合行为和结构的信息,请参阅时间序列集合。

metaField应该很少改变,并且可以是任何数据类型。 metaField可以是对象,并且可以包含子字段。将字段定义为metaField后,您可以更改metaField的值,但不能将metaField重新定义为其他字段。示例,如果您使用定义为字段AmetaField创建时间序列文档,则以后无法将字段B转换为metaField 。但是,如果A的值是对象,则可以向A添加新的子字段。

注意

将大量用作metaField可能会导致意外的集合行为,因为大量相等性取决于特定顺序。

MongoDB使用metaField对数据进行分区,以实现高效的组织和检索。创建时间序列集合时, MongoDB文档分组到存储桶中。存储桶中的文档股票相同的metaField值,并具有接近的timeField值。

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

  • 选择很少或从不更改的字段作为元字段的一部分。

  • 如果可能,请选择筛选器表达式中常见的标识符或其他稳定值作为 MetaField 的一部分。

  • 避免选择不用于筛选的字段作为 MetaField 的一部分。相反,使用这些字段作为测量值。

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

具有细粒度或不断变化的metaField值的集合会生成许多稀疏填充的短期存储桶,从而增加集合的关联基数。增加关联基数会导致存储和查询效率下降。

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

granularity
granularity 存储桶限额
seconds
1 小时
minutes
24 小时
hours
30天

默认, granularity设立为seconds 。您可以将granularity值设置为最接近同一数据源传入测量值之间的时间跨度,从而提高性能。示例,如果您要记录来自数千个传感器的天气数据,但每5分钟仅记录一次来自每个传感器的数据,请将granularity设立为"minutes" 。追加新文档的频率越低,粗粒度在存储和性能方面的优势就越大。

granularity 设置为 hours 会将长达一个月的数据导入事件分组到单个存储桶中,从而拖延遍历时间并减慢查询速度。将其设置为 seconds 会导致每个轮询间隔有多个存储桶,其中许多可能只包含一个文档。

在选择granularity值时,还应考虑典型查询。示例,如果您希望查询一次获取1天的数据,则使用“minutes”(分钟)。更细的粒度(例如“秒”)可创建涵盖一小时的存储桶。这需要更多的存储桶来表示相同的数据,从而对存储和查询性能产生负面影响。较粗的粒度,如“小时”(具有30天的存储桶跨度),需要查询一次获取30天的数据,然后过滤掉其中的大部分。

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

当您将数据追加到打开或重新打开的存储桶时,所有时间序列集合都使用压缩的存储桶格式。压缩缓存中的时间序列数据支持高关联基数工作负载,同时保持高效的查询性能。

后退

时间序列数据