我们有一个拥有336GB数据的mongodb。
不幸的是,该服务器上只有8GB内存。
是否可以说这会降低数据库速度,尤其是当我尝试遍历整个集合时?
我可以做些什么来改善表现?
答案 0 :(得分:1)
为了使事情正确,这不是一个“大”的生产设置;它实际上相对较小。
除此之外:
是否可以说这会降低数据库速度,尤其是当我尝试遍历整个集合时?
确实如此。当您迭代集合时,MongoDB需要在您的数据中进行分页,即使您在集合上有索引也是如此。
例外情况是当你使用indexOnly
游标时,所有数据都来自索引,包括返回的文档;这些被称为覆盖查询。
你遇到的问题是你的数据集比你的RAM数量大42倍,假设你被允许使用你所有的RAM(当然不是这样,操作系统和其他程序会为自己预留金额)。这意味着如果您希望迭代整个集合,您将无法按性能执行此操作,而MongoDB可能会对其分配的内存进行页面颠簸。
我可以做些什么来改善表现?
获得更多内存。
如果在一台服务器上获得太多RAM,那么你也可以尝试一些分片。
我的目标是比RAM多20倍的数据,在大多数情况下这不应该太糟糕。
答案 1 :(得分:0)
您应该将集合http://docs.mongodb.org/manual/applications/indexes/编入索引以提高性能,但请记住,mongodb在查询索引时会使用内存,因此请确保您创建的每个索引都适合您服务器上的内存。
您也可以对您的收藏进行分片,但您需要更多服务器来执行此操作。 http://docs.mongodb.org/manual/sharding/
而且我知道这很明显,但获得更多记忆 - 它便宜!
答案 2 :(得分:0)
Mongodb使用内存映射文件将数据映射到系统虚拟内存。如果您尝试访问的数据多于系统的可用内存,则性能会很差。您将不得不考虑其他选项,如分片,索引,增加RAM等。索引可以提高性能,但如果在大型数据集上完成则不会太多,因为索引也需要内存。一些参考文献:
前3个问题讨论内存映射文件:http://docs.mongodb.org/manual/faq/storage/
关于分片:http://docs.mongodb.org/manual/faq/sharding/
确保索引适合RAM:http://docs.mongodb.org/manual/applications/indexes/#ensure-indexes-fit-ram
答案 3 :(得分:0)
其他答案表示“有足够的内存来容纳您的数据”或“每个索引都有足够的内存”或“在数据中有一些RAM”。这些都不是非常有效,也不是非常精确的容量规划。
您需要了解您的访问模式,然后确定有效使用数据所需的索引。如果所有的索引都适合可用的RAM,并为最近接触的文档留出一些余地,那么你应该没问题。
当您的工作集(访问数据+索引)无法容纳在RAM中时,您的性能将与磁盘访问速度相关联。根据磁盘的速度以及吞吐量和延迟要求,它可以正常运行,也可能不运行。
虽然没有足够的信息可以肯定地说明您是否会在这台特定的计算机上成功或失败,但您应该能够通过分析索引需求等来收集足够的信息来确定自己。