带有分片的内存中的MongoDB索引

nny*_*thm 2 indexing scalability sharding in-memory mongodb

街上的一句话是,如果你不能保留你在内存中使用的索引,那么MongoDB会变慢.这如何与分片一起使用?分片是否仅在内存中保留自己的BTree,或者每个分片是否需要将整个集合的索引保留在内存中?

Gat*_* VP 7

分片只在内存中保留自己的BTree ......?

是的,每个分片都管理自己的索引.

街上的一句话是,如果你不能保留你在内存中使用的索引,那么MongoDB会变慢.

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

如果使用分片键执行查询,它将直接路由到正确的服务器.在大多数情况下,这可以平衡工作量.因此,100个查询可以分布在100个服务器上,每个服务器只回答1个查询.

但是,如果使用辅助键执行查询,则该查询必须转到每个服务器.因此,对路由器的100次查询将导致100个服务器上的10,000个查询或每个服务器100个查询.随着您添加更多服务器,这些"非shardkey"查询的效率会越来越低.工作量并没有变得更加平衡.

一些细节在MongoDB的文档都可以在这里.