我将亚秒级粒度的多个时间序列存储在MongoDB中。数据库通过一堆Python脚本进行更新,并且存储的数据用于两个主要目的:
(1)它是所有系列中最新数据的中央信息源。每秒约有多个脚本对其进行访问,以读取每个集合中的最新数据点。
(2)这是一个长期数据存储。我经常将整个数据库加载到Python中以分析数据趋势。
为了使数据库尽可能高效,我想存储数据(理想情况下,每个集合每天保存一个文档)。由于(1),存储桶越大,访问最后一个数据点所需的排序越昂贵。
我在这里可以想到两种解决方案,但是我不确定有什么替代方法,或者哪种方法最好:
a)将最新的时间戳存储在单独的数据库/集合中的单行文档中。读取时无需排序,但每次任何序列获得新的数据点时都需要额外的写入。
b)保持水桶较小(每个水桶1小时)并进行分类。
答案 0 :(得分:0)
使用a)可以将较小的文档写到单独的集合中,这在性能上优于更新较大的文档。您可以根据自己的喜好在此集合中写入所有新数据点,并在小时或一天中汇总它们。但是正如您所说,这需要附加的写操作。
对于b),您需要牢记排序字段的索引大小。索引大小是否适合内存?这对于排序的性能至关重要,因为您不想对大型集合进行内存排序。
我建议探索一种混合方法,即在“传入”集合中在有限的时间内存储单个数据点。一旦达到小时或天的存储间隔,就可以将数据点聚合到存储桶中,并将它们存储在其他集合中。当然,现在应用程序中还存在一些其他复杂性,需要能够读取存储桶和数据点集合并将它们合并。