我在MongoDB中创建了一个集合,它有四个索引(一个用于_id,一个用于分片键,另外两个索引用于字段f1和f2上的查询优化),它在8节点上分片集群(每个节点有14GB RAM)。该应用程序是写
更新:我使用WiredTiger作为数据库引擎。
问题是,当我删除其中一个二级索引(从f1或f2)时,插入速度达到了可接受的速率,但当我添加新索引时,插入性能迅速下降!
我想问题是索引不适合RAM,因为访问模式接近随机,因此硬盘速度将成为瓶颈。但是我希望MongoDB将所有索引加载到RAM中,因为每个节点的总RAM是14GB,并且' top'命令说MongoDB在每个节点上使用大约6GB。索引大小如下:
每个节点:
如您所见,总索引大小约为9.5GB,MongoDB使用大约6GB,可用内存为14GB,所以
最好的问候
答案 0 :(得分:0)
添加新索引后性能下降的原因
预计索引会降低写入性能,因为每个索引都会增加完成写入所需的工作量。性能下降了多少?您能量化它降低了多少以及可接受的性能变化吗?您能向我们展示一个示例文档并指定您正在创建的索引吗?有些索引的维护成本要高于其他索引。
如果问题是关于随机访问索引,为什么MongoDB不会在RAM上加载所有索引?
它将加载正在使用的内容。你怎么知道它没有将索引加载到RAM中?尽管有额外的RAM,你是否看到了很多页面错误?你的WiredTiger缓存大小设置为什么?
如何确定每个索引的哪个部分加载到RAM以及哪个部分没有加载?
我不相信有一种简单的方法可以做到这一点。