12

我测试了两个场景单个巨大集合与多个小集合,发现查询时性能存在巨大差异。这就是我所做的。

案例 1:我为 10 种不同类型的产品创建了一个包含 1000 万条记录的产品集合,其中每种产品类型恰好有 100 万条记录,并且我在 ProductType 上创建了索引。当我运行条件 ProductType=1 和 ProductPrice>100 和 limit(10) 的示例查询以返回 10 条 ProductType=1 且价格大于 100 的记录时,当集合中有很多价格的产品时,大约需要 35 毫秒大于 100,当 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 毫秒。为什么?

4

1 回答 1

16

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

简而言之,将它们分开是一种有效的优化,但是在您真正决定采用该路线之前,您应该使您的索引更适合您的查询,我认为这是一个激进的措施(在这种情况下,产品价格的索引可能会帮助您更多) .

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

于 2012-07-17T01:40:43.383 回答