内存中带分片的MongoDB索引

内存中带分片的MongoDB索引,mongodb,indexing,scalability,sharding,in-memory,Mongodb,Indexing,Scalability,Sharding,In Memory,流行的说法是,如果不能将正在使用的索引保存在内存中,MongoDB会变得很慢。这是如何与切分一起工作的?分片是否只在内存中保留自己的B树,还是每个分片都需要在内存中保留整个集合的索引?仅保留索引中自己的部分(它不知道其他分片的数据)。否则,缩放将不会很好地工作。有关分片的更多信息,请参阅本文档: 碎片是否只在内存中保留自己的BTree 是的,每个碎片管理自己的索引 流行的说法是,如果不能将正在使用的索引保存在内存中,MongoDB会变得很慢 在使用分片和二级索引时,您实际上可能会遇到更糟糕的

流行的说法是,如果不能将正在使用的索引保存在内存中,MongoDB会变得很慢。这是如何与切分一起工作的?分片是否只在内存中保留自己的B树,还是每个分片都需要在内存中保留整个集合的索引?

仅保留索引中自己的部分(它不知道其他分片的数据)。否则,缩放将不会很好地工作。有关分片的更多信息,请参阅本文档:

碎片是否只在内存中保留自己的BTree

是的,每个碎片管理自己的索引

流行的说法是,如果不能将正在使用的索引保存在内存中,MongoDB会变得很慢

在使用分片和二级索引时,您实际上可能会遇到更糟糕的情况。关键问题是路由器进程(
mongos
)对二级索引中的数据一无所知

如果使用shard密钥执行查询,它将直接路由到正确的服务器。在大多数情况下,这会降低工作量。因此,100个查询可以分布在100台服务器上,而每台服务器只回答1个查询

但是,如果使用辅助键执行查询,则该查询必须转到每个服务器。因此,对路由器的100次查询将在100台服务器上产生10000次查询,或者每台服务器产生100次查询。随着服务器的增加,这些“非shardkey”查询的效率越来越低。工作负荷不会变得更加平衡


MongoDB文档中提供了一些详细信息。

如果您对多个键进行切分,您仍然可以对所有这些键进行高效查询吗?是的,但受对复合键进行索引和排序的限制。您必须对此进行测试,并知道哪些查询可以工作,键的顺序非常重要。