关于查询时间序列数据
MongoDB 将具有匹配元字段的文档分组以优化时间序列数据的存储和查询延迟。您选择的元字段
对优化应用程序中的查询影响最大。
查询metaField
您查询时间序列集合的方式与查询标准MongoDB集合的方式相同。有关示例查询和示例聚合管道,请参阅查询时间序列集合。有关查询最佳实践的列表,请参阅查询最佳实践。
针对时间序列数据的查询通常关注集合中的单个时间序列。例如,考虑一个使用以下模式跟踪股票数据的时间序列集合
{ _id: 573a1397f29313caabce8347, "ticker": "MDB", "timestamp": ISODate("2024-07-24T13:45:00.000Z"), "price": 248.21, "volume": 6930 }
该集合有以下设置
timeseries: { timeField: "timestamp", metaField: "ticker", granularity: "seconds" }
MongoDB将具有匹配的ticker
值的文档分组。服务器不需要检查所有文档的所有字段,只需检查metaField
即可缩小搜索范围到唯一的时间序列。这符合预期的用例,即搜索单个股票的活动。搜索MongoDB股票(MDB)信息的用户不需要考虑Amazon(AMZN)的结果。
查询timeField
查询时间序列数据的第二个主要维度是时间。由于MongoDB将同时具有相同metaField
值和接近timeField
值的文档分组,这进一步缩小了查询的范围到一系列桶。最近的事务保留在内存中,因此可以轻松实时流式传输数据。
块处理
从版本8.0开始,MongoDB可以使用块处理来执行某些时间序列查询。这种性能改进通过处理数据的“块”来处理查询,而不是单个值。块处理在处理时间序列集合时提高了查询执行速度和吞吐量。
块处理显著提高了以下阶段的长时间运行聚合管道的性能并减少了开销
MongoDB会自动为符合条件的时序查询启用块处理。您不能手动指定查询是否使用块处理。
要查看您的时序查询是否使用块处理,请查看解释计划输出中的stages
。