0

我们有一个 mongodb,上面有 336GB 的数据。

不幸的是,该服务器上只有 8GB 内存。

说这会减慢数据库速度是真的吗,尤其是当我尝试遍历整个集合时?

我可以做些什么来提高性能?

4

4 回答 4

1

为了把事情做好,这不是一个“大”的生产设置。它实际上是相对较小的。

除此之外:

说这会减慢数据库速度是真的吗,尤其是当我尝试遍历整个集合时?

是的。当您迭代集合时,MongoDB 将需要在您的数据中分页,即使您在集合上有索引也是如此。

例外情况是当您使用indexOnly游标时,所有数据仅来自索引,包括返回的文档;这些也称为覆盖查询。

您在这里遇到的问题是您的数据集比您的 RAM 量大 42 倍,假设您被允许使用所有 RAM(这当然不是真的,操作系统和其他程序将为自己保留数量)。这意味着,如果您希望迭代整个集合,您将无法高效地完成它,相反,MongoDB 可能会页面颠簸其分配的内存。

我可以做些什么来提高性能?

获得更多的内存。

如果在一台服务器上获得太多 RAM 很痛苦,您也可以尝试一些分片。

我的目标是获得比 RAM 多 20 倍的数据,这在大多数情况下应该不会太糟糕。

于 2013-02-27T09:12:21.313 回答
0

您应该索引您的集合http://docs.mongodb.org/manual/applications/indexes/以提高性能,但请记住,mongodb 在查询索引时会使用内存,因此请确保您创建的每个索引都适合内存你在你的服务器上。

您也可以对您的收藏进行分片,但您需要更多的服务器来执行此操作。http://docs.mongodb.org/manual/sharding/

而且我知道这很明显,但要获得更多内存-便宜!

于 2013-02-27T08:18:34.300 回答
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

于 2013-02-27T09:12:06.243 回答
0

其他答案说“有足够的内存来容纳您的数据”或“每个索引都有足够的内存”或“数据中有一些 RAM 的倍数”。这些对于容量规划都不是很有效也不是很精确。

您需要知道您的访问模式将是什么,然后决定您需要哪些索引才能有效地使用您的数据。如果您的所有索引都适合可用的 RAM,并且为最近接触的文档留出了一些空间,那么您应该没问题。

当您的工作集(访问的数据 + 索引)无法容纳在 RAM 中时,您的性能将与磁盘访问速度相关,而不是其他任何东西。根据您的磁盘速度以及您的吞吐量和延迟要求,它可能会正常工作,也可能不会。

虽然没有足够的信息可以确定您在这台特定机器上是否会成功或失败,但您应该能够收集足够的信息来通过分析您的索引需求等来确定自己。

于 2013-02-27T12:35:13.047 回答