我测试了两个场景,单个大集合和多个小集合,在查询时发现了巨大的性能差异。这就是我所做的。
案例1:我创建了一个产品集合,其中包含10种不同类型产品的1000万条记录,其中每种产品类型恰好有100万条记录,并且我在ProductType上创建了索引。当我使用条件ProductType=1、ProductPrice>100和limit( 10 )运行一个示例查询,返回10条价格大于100的ProductType=1记录时,当集合中有许多价格大于100的产品时,大约需要35毫秒;当ProductType=1中价格大于100的产品数量非常少时,相同的查询大约需要8000毫秒(8秒)。
案例2:我为每个ProductType创建了10个不同的Product表,每个表包含100万条记录。在包含productType 1记录的集合1中,当我使用条件ProductPrice>100和limit( 10 )运行相同的示例查询以返回价格大于100的产品的10条记录时,当集合中有许多价格大于100的产品时,该查询大约需要2.5毫秒,而当价格大于100的产品数量非常少时,相同的查询大约需要1500毫秒(1.5秒)。
那么为什么会有这么大的差异呢?第一种情况和第二种情况之间的唯一区别是一个巨大的集合与多个较小的集合,但我在第一个实例中创建了ProductType的索引一个巨大的集合。我猜性能差异是由第一种情况下的索引引起的,我需要在第一种情况下使用该索引,否则它的性能会更差。我预计在第一种情况下,由于索引的原因,性能会有所下降,但我没有想到在第一种情况下会有大约10倍的速度慢的巨大差异。
因此,一个大集合上的8000毫秒与1500毫秒对多个小集合。为什么?
发布于 2012-07-17 09:40:43
分离集合为您提供了一个空闲的索引,而没有任何实际的开销。索引扫描是有开销的,特别是如果索引并没有真正帮助您减少它必须扫描的结果的数量(如果您在索引中有一百万个结果,但您必须扫描它们并检查它们,这对您没有太大帮助)。
简而言之,将它们分离出来是一种有效的优化,但在实际决定采用该路径之前,您应该使索引更适合您的查询,我认为这是一个极端的措施(在这种情况下,产品价格索引可能会对您有更大的帮助)。
使用explain()可以帮助您理解查询是如何工作的。一些基本要求是:理想情况下,您需要较低的nscanned与n的比率。通常情况下,您不希望scanAndOrder = true,也不希望BasicCursor (这意味着您根本不使用索引)。
https://stackoverflow.com/questions/11514781
复制相似问题