我是NoSQL系统的新手。我想使用Java+Spring+MongoDB (不重要)。我尝试为我的数据构建正确的方案。我会有太多的日志记录(大约每年3000000)。记录结构如下所示:
{
shop: 'shop1',
product: 'product1',
count: '10',
incost: '100',
outcost: '120',
operation: 'sell',
date: '2015-12-12'
}我有大约1,000家商店和大约30000种产品。
我应该有按天或月划分的计数和或( sum *(outcost-incost)) by shops+product的报告。
*店铺表示可选的过滤器。在这种情况下(没有商店)性能无关紧要。
*可能需要1年以上的报告,但性能并不重要。
我可以使用日期,商店,产品的索引的单一集合“日志”。或者我应该根据商店和年份明确地将这个集合拆分为子集合?
抱歉,如果我的问题很愚蠢,我只是初学者…
问候你,米纳斯
发布于 2016-01-10 01:30:19
除非文档进一步增长,否则这会很好地工作。在这种情况下,如果您想要向现有文档添加更多字段或附加现有字段,并且您认为它可能会超过16MB,那么最好使用单独的集合。
索引键似乎也很好,因为你有商店,日期和产品字段的复合索引。
如果从单个集合中检索完整的数据,而不是从多个集合中获取完整的数据,那么您将获得一些性能提升(因为只有一个磁盘寻道发生,所以更容易和更快)。
发布于 2016-01-10 03:27:44
我不会在主集合上做太多的聚合,30亿条记录是相当多的。
我能想到的一个大问题是,任何查询都可能是巨大的,返回大量的文档。现在,确实可以通过使用分片来分散数据本身的权重来减轻查询此集合的大多数负面因素,但是,返回到mongos的大量数据可能会很慢,而且会很痛苦。
总有一天,再多的索引也救不了你,因为你的集合实在太大了。
如果只是显示集合,这并不重要,MongoDB可以很容易地做到这一点,它是不能很好地工作的聚合。
我会按照你的建议去做:根据数据片段和时间段预先聚合到其他集合中。
https://stackoverflow.com/questions/34695416
复制相似问题