流行的说法是,如果不能将正在使用的索引保存在内存中,MongoDB 就会变慢。这如何与分片一起工作?分片是否只在内存中保留自己的 BTree,还是每个分片都需要将整个集合的索引保留在内存中?
问问题
2976 次
2 回答
7
分片是否只在内存中保留自己的 BTree...?
是的,每个分片都管理自己的索引。
流行的说法是,如果不能将正在使用的索引保存在内存中,MongoDB 就会变慢。
使用分片和二级索引时,您实际上可以预期更糟。关键问题是路由器进程 ( mongos
) 对二级索引中的数据一无所知。
如果您使用分片键进行查询,它将直接路由到正确的服务器。在大多数情况下,这可以平衡工作量。所以 100 个查询可以分布在 100 个服务器上,每个服务器只回答 1 个查询。
但是,如果您使用辅助键进行查询,则该查询必须到达每台服务器。因此,对路由器的 100 次查询将导致跨 100 台服务器的 10,000 次查询或每台服务器 100 次查询。随着您添加更多服务器,这些“非 shardkey”查询的效率会越来越低。工作量并没有变得更加平衡。
此处的 MongoDB 文档中提供了一些详细信息。
于 2012-01-31T20:33:01.483 回答
0
只是它自己的索引部分(它不知道其他分片的数据)。否则,缩放不会很好地工作。有关分片的更多信息,请参阅此文档: http ://www.mongodb.org/display/DOCS/Sharding+Introduction
于 2012-01-31T18:21:29.563 回答