我使用MongoDB作为只读文档源,用于计算统计信息。每个文档都没有子文档,但是数据库大约有大约900,000个文档,每天会增加大约1k个文档,在数据库空闲的时候添加。
所以,我想了解以下事项:
我已经读过,当整个集合存储在RAM中时,MongoDB效果最佳。假设我的数据库大约是400MB而且我们的服务器可以很容易地把整个东西塞进RAM中,有没有办法告诉MongoDB将我的整个集合预先加载到RAM中?
我还读过,有些情况下创建副本集有助于提高数据库的读取性能。我的情况是否会有所帮助?
我正在线程化我的统计计算,但是请注意,当我进行这些计算时,完成我对mongoDB运行的查询的时间是三倍,而不是同步运行它们。当我同时向同一个集合发出请求时,我能做些什么来提高数据库的性能吗?
答案 0 :(得分:3)
不,当集合在RAM中时,MongoDB不能正常工作。我不知道是谁告诉你的,但这是关于MongoDB如何工作的常见错误概念。
当MongoDB不仅能够将您的工作集适合RAM(What does it mean to fit "working set" into RAM for MongoDB?)而且能够以极快的速度将其加载到RAM中时效果最佳。有助于提高工作集分页速度的一件事是文档的大小。
这就是为什么MongoDB限制在16MB的原因之一,已经发现大小更大的开始会对性能产生严重影响。基本上你花了太多时间从磁盘加载数据,这是通过在SQL技术中逻辑拆分表来实现非规范化的一个原因;使它们加载速度更快。
这意味着您可能必须优化值的大小和字段名称的大小,以满足读取的性能需求。您当然也必须匹配硬件。
副本集实际上并非旨在帮助提高读取性能,它们旨在通过自动故障转移为您的数据提供高可用性。您阅读的主题建议从辅助对象获取陈旧的读取。正如已经证明的那样(编辑:因为经证实是一个强有力的词,这是基于场景的我将会说“找到”)最近,实际上可能不如使用PrimaryPreferred读取偏好。
至于改善性能,我们需要您的页面错误,IO瓶颈和一般mongostat和顶部的统计数据。
答案 1 :(得分:1)
您可以使用touch command说服数据库将集合加载到内存中。但请记住,这不是永久性的。如果您不尽快访问缓存的文档,它们将被取消隐藏,以支持更常用的文档。
副本集是提高并行读取操作性能的好方法。副本集的每个服务器都镜像整个数据,并且可以自己响应任何查询,而无需联系其他服务器。这意味着当您将副本集中的服务器数量增加一倍时,您还可以将同时查询的性能提高一倍。
请注意,您在连接上设置的read preferences可能会阻止它使用多个服务器。
或者你可以构建一个分片群集,但这在技术上要比副本集复杂得多,并且当你的查询不匹配的分片键时,它不会提高读取性能。收集或当您选择了分片键时,请求不会在分片之间均匀分布。