内存中的 MongoDB 索引与分片

标签 mongodb indexing scalability sharding in-memory

坊间传言,如果您不能将正在使用的索引保存在内存中,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/

相关文章:

c# - 使用 AddToSet 更新不使用 MongoDB C# 更新空值

node.js - Mongoose throwing 在使用变量代替显式字符串时,必须指定字段错误

arrays - 如何从 NumPy 中的二维数组获取多个坐标

c# - 是否建议在高流量网站上使用 ASP.NET 用户管理系统

database - 关系数据库的哪些方面使它们难以在 Google App Engine 等服务上充分扩展?

用户加入组的 MongoDB 模式策略

node.js - 如何在 mongoose + express 中使用模式方法

python - 如何提取特定类别之前的最后 3 个索引号

sql - 为什么 SQL 忽略索引提示并选择不同的索引?

iis - 配置 IIS 以提供静态文件/CDN?