MongoDB性能问题:单个巨大集合与多个小集合

Ana*_*lan 10 mongodb mongodb-.net-driver

我测试了两个场景Single Huge collection vs Multiple Small Collections,并在查询时发现了巨大的性能差异.这就是我做的.

案例1:我创建了一个产品集合,其中包含10种不同类型产品的1000万条记录,并且每种产品类型的记录正好为100万条,我在ProductType上创建了索引.当我运行条件ProductType = 1和ProductPrice> 100并且限制(10)的示例查询返回ProductType = 1的10条记录并且其价格大于100时,当集合有很多产品价格时花了大约35毫秒当我们在ProductType = 1中的产品数量非常少而且价格大于100时,相同的查询大约需要8000毫秒(8秒).

案例2:我为每个ProductType创建了10个不同的Product表,每个ProductType包含100万条记录.在包含productType 1记录的集合1中,当我运行条件为ProductPrice> 100且limit(10)的相同样本查询返回10个价格大于100的产品记录时,当集合有很多时,它花了大约2.5毫秒价格超过100的产品,当价格大于100的产品数量非常少时,同样的查询大约需要1500毫秒(1.5秒).

那么为什么会有这么大的差异呢?案例一和案例二之间的唯一区别是一个巨大的集合与多个较小的集合,但我在第一个案例中创建了一个单一巨大集合的ProductType索引.我猜性能差异是由第一种情况下的索引引起的,我在第一种情况下需要该索引,否则性能会更差.我预计在第一种情况下由于指数会有一些表现缓慢但我没想到在第一种情况下差异大约10倍.

因此,对于一个巨大的集合与多个小集合相比,8000毫秒对1500毫秒.为什么?

Eve*_*man 15

分离集合为您提供免费索引,没有任何实际开销.索引扫描会有开销,特别是如果索引并没有真正帮助您减少必须扫描的结果数量(如果索引中有一百万个结果,但您必须全部扫描并检查它们,它不会帮助你太多).

简而言之,将它们分离是一种有效的优化,但是在实际决定采用该路线之前,您应该使您的索引更好地用于您的查询,我认为这是一个极端的措施(在这种情况下,产品价格指数可能会帮助您更多) .

使用explain()可以帮助您了解查询的工作方式.一些基础知识是:理想情况下,您需要较低的nscanned与n的比率.您不希望scanAndOrder = true,并且您通常不需要BasicCursor(这意味着您根本不使用索引).