坊间传言,如果您不能将正在使用的索引保存在内存中,MongoDB 会变慢。这如何与分片一起工作?分片是只在内存中保留自己的 BTree,还是每个分片都需要在内存中保留整个集合的索引?
最佳答案
Does a sharded only keep its own BTree in memory...?
是的,每个分片管理自己的索引。
The word on the street is that MongoDB gets slow if you can't keep the indexes you're using in memory.
在使用分片和二级索引时,您实际上可以预料到更糟的情况。关键问题是路由器进程(mongos
)对二级索引中的数据一无所知。
如果您使用分片键进行查询,它将直接路由到正确的服务器。在大多数情况下,这会平衡工作量。因此 100 个查询可以分布在 100 个服务器上,每个服务器只回答 1 个查询。
但是,如果您使用辅助键进行查询,则该查询必须转到每台服务器。因此,对路由器的 100 个查询将导致 100 个服务器上的 10,000 个查询或每个服务器 100 个查询。随着您添加更多服务器,这些“非 shardkey”查询变得越来越低效。工作量不会变得更加平衡。
MongoDB 文档中提供了一些详细信息 here .
关于内存中的 MongoDB 索引与分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9084569/