时间序列集合注意事项
时间序列集合的行为通常与普通集合相同,但也有一些例外情况。有关时间序列集合行为和结构的信息,请参阅时间序列集合。
元字段注意事项
metaField
应该很少改变,并且可以是任何数据类型。 metaField
可以是对象,并且可以包含子字段。将字段定义为metaField
后,您可以更改metaField
的值,但不能将metaField
重新定义为其他字段。示例,如果您使用定义为字段A
的metaField
创建时间序列文档,则以后无法将字段B
转换为metaField
。但是,如果A
的值是对象,则可以向A
添加新的子字段。
注意
将大量用作metaField
可能会导致意外的集合行为,因为大量相等性取决于特定顺序。
MongoDB使用metaField
对数据进行分区,以实现高效的组织和检索。创建时间序列集合时, MongoDB文档分组到存储桶中。存储桶中的文档股票相同的metaField
值,并具有接近的timeField
值。
时间序列集合中的存储桶数量取决于唯一的metaField
值的数量。与具有很少或从不更改的简单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天的数据,然后过滤掉其中的大部分。
有关示例,请参阅设置时间序列数据的粒度。
压缩和硬件
当您将数据追加到打开或重新打开的存储桶时,所有时间序列集合都使用压缩的存储桶格式。压缩缓存中的时间序列数据支持高关联基数工作负载,同时保持高效的查询性能。