2015-11-30 77 views
1

MongoDB Documentation为什么查询隔离是一件好事?

一般而言,在分片环境中最快的查询是那些 mongos将路由到一个碎片

这似乎是违反直觉的给我。分解的整个目标不是将数据横向分散处理,而不是垂直分布?如果在多个分片上完成处理,这样处理是否平行,会不会更快?

为什么这样做比在这种情况下做的多台机器更好的一台机器上所有的处理?

回答

0

与所有一般性发言,也有很多例外,但在此之前我们得到这些,这或许会更有意义有一个调整的措辞:

一般而言,在分片最快的查询环境是那些 mongos 可以很容易地路由到单个碎片

对于mongos路由查询以单个碎片,则它将总体上满足以下条件:

  • 它会利用碎片关键的
  • 因此,将被索引(总有在片键索引)
  • 将具有良好的数据局部性(所有数据都在一个碎片)
  • 查询将尽可能快地恢复为碎片可以回应
  • 如果大多数查询这个样子,你将有一个内存击中指数(至少)
一个好球

这种类型的查询通常会更快,如果您有这种类型的查询模式(很多人都这样做),那么该语句基本上是正确的。

但是,如果你是(例如)做一些计算密集型横跨一个大的数据集并行化以及(复杂聚集在一个大的数据集),然后拆分你的工作肯定有优势。

但是,也有潜在的缺点 - mongos必须从所有分片中获得结果并且可能进行一些处理(想象在分片之间进行分类),因此结果只会与最慢的分片一样快可能是mongos)。

在这一切都取决于你的工作量,数据分布以及你如何选择你的片键结束,但作为一个笼统的说法是不正确不。

+0

我仍然不明白为什么它会更快。比方说,我运行一个普通的查询(没有聚合框架的东西)的查询,它返回1M文档。如果它从5个碎片中读取20万个文档并从1个碎片中读取1M个文件,会不会更好?为什么在这种情况下击中单个碎片会更好。 –

+0

这可能会更快,特别是如果200k表示您可以放在内存中的文档的最大数量(接近)的最大数量的文档,因此您基本上通过分片扩展了可用驻留内存。但是,如果你必须在你的用例中增加这段序言以证明它更快,那么它确实不符合一般性声明的要求。对于您的用例,声明可能根本不适用,文档给出的是最常见的一般查询和使用模式的一些指导(如我所概述的) –

+0

我想我不明白的是为什么要分裂跨越分片让我们说1k文档的情况也不会更好 - 远低于任何内存限制。是的,一个碎片可以快速将它们拉出来,但是如果5个碎片每个拉到200个碎片,它会不会更快? –