Multithreading 针对读取优化MongoDB

Multithreading 针对读取优化MongoDB,multithreading,mongodb,mongoid,Multithreading,Mongodb,Mongoid,我使用MongoDB作为只读文档源,用于计算统计数据。每个文档都没有子文档,但数据库有大约900k个文档,每天将增加约1k个文档,在数据库空闲时添加 因此,我想了解以下几点: 我已经读到,当整个集合存储在RAM中时,MongoDB工作得最好。假设我的数据库约为400MB,并且我们的服务器可以轻松地将整个内容填充到RAM中,有没有办法让MongoDB将我的整个集合预加载到RAM中 我还了解到,在某些情况下,创建副本集将有助于提高数据库的读取性能。我的场景是其中之一吗 我正在处理我的统计计算,但请注

我使用MongoDB作为只读文档源,用于计算统计数据。每个文档都没有子文档,但数据库有大约900k个文档,每天将增加约1k个文档,在数据库空闲时添加

因此,我想了解以下几点:

  • 我已经读到,当整个集合存储在RAM中时,MongoDB工作得最好。假设我的数据库约为400MB,并且我们的服务器可以轻松地将整个内容填充到RAM中,有没有办法让MongoDB将我的整个集合预加载到RAM中

  • 我还了解到,在某些情况下,创建副本集将有助于提高数据库的读取性能。我的场景是其中之一吗

  • 我正在处理我的统计计算,但请注意,当我处理这些计算时,完成针对mongoDB运行的查询所需的时间是处理它们时的三倍,而不是同步运行它们。当我同时对同一个集合发出请求时,我能做些什么来提高数据库的性能吗

  • 关于第1点: 您可以使用来说服数据库将集合加载到内存中。但请记住,这不是永久性的。如果您不能很快访问缓存的文档,它们将被取消缓存,以支持使用更频繁的文档

    关于第2点和第3点: 副本集是提高并行读取操作性能的好方法。副本集的每个服务器都镜像整个数据,并且可以自己响应任何查询,而无需联系其他服务器。这意味着,当副本集中的服务器数量翻倍时,同步查询的性能也会翻倍

    请记住,您设置的连接可能会阻止它使用多个服务器


    或者,您可以构建分片集群,但这在技术上比副本集复杂得多,并且当查询与集合的分片键不匹配,或者当您选择的分片键的方式导致请求在分片之间分布不均匀时,读性能不会有多大提高。

    否,当集合位于RAM中时,MongoDB的工作效果不佳。我不知道是谁告诉你的,但对于MongoDB的工作原理,这是一个常见的误解

    当MongoDB不仅可以将您的工作集放入RAM()中,而且还可以以非常快的速度将其加载到RAM中时,它工作得最好。有一件事可以帮助提高工作集中分页的速度,那就是文档的大小

    这就是MongoDB被限制为16MB的原因之一,已经发现尺寸越大,对性能的影响就越大。基本上,你花了太多的时间从磁盘加载数据,这是在SQL技术中通过逻辑拆分表来实现非规范化的一个原因;以加快加载速度

    这意味着您可能必须优化值的大小和字段名的大小,以满足读取的性能需要。当然,您还必须匹配硬件

    副本集实际上并不是为了帮助提高读取性能而设计的,它们是为了通过自动故障切换为数据提供高可用性而设计的。你所读的主题建议你从第二本书里读过时的书。正如最近所证明的那样(edit:因为proven是一个强有力的词,而且这是基于场景的,我要说的是“found”),它实际上比使用PrimaryPreferred read preference的性能要差


    至于提高性能,我们需要您提供有关页面错误、IO瓶颈和通用mongostat和top的统计信息。

    如果您有多个问题,请为每个问题打开一个新问题。如果有人能回答三个问题中的一个,但不是全部,他们不会写答案,因为这会被认为是不完整的。MongoDB文档可以帮助您:谢谢,这是一个让我开始的好地方!“没有办法”是什么意思?这里有touch命令:复制集用于HA和故障切换。它们不是衡量阅读的方式。@AsyaKamsky谢谢,我不知道触摸。答案已编辑。@AsyaKamsky提高可靠性只是使用副本集的一个原因。您可以使用副本集来扩展读取,方法是拥有多个二级副本并在它们之间分发读取。如果整个集合都在RAM中,这比不完全在RAM中要好。我觉得你说的不是真的。当然,如果磁盘IO速度较慢,则可能会严重损害整体性能。但是,如果可以在用户访问数据库之前加载整个集合。。。那么,这不是很理想吗?还有许多其他因素可能会使查询速度变慢,当然也会产生重大影响(如缺少索引)。@wiredparie操作系统很少将整个集合在ram中长时间保存,即使它很小,mongod当然也不会将其固定到内存中,因此,它实际上不会表现得更好。如果它被频繁使用,它将被保存在内存中,特别是在没有内存压力的情况下。(我对你的答案投了更高的票,因为我确实认为它比公认的答案更好…:)。“正如最近证明的那样,这实际上可能表现得不太好”[需要引用]