在分片集合上添加新索引后,MongoDB写入性能下降

时间:2015-04-12 10:52:13

标签: mongodb performance bigdata

我在MongoDB中创建了一个集合,它有四个索引(一个用于_id,一个用于分片键,另外两个索引用于字段f1和f2上的查询优化),它在8节点上分片集群(每个节点有14GB RAM)。该应用程序是写

更新:我使用WiredTiger作为数据库引擎。

问题是,当我删除其中一个二级索引(从f1或f2)时,插入速度达到了可接受的速率,但当我添加新索引时,插入性能迅速下降!

我想问题是索引不适合RAM,因为访问模式接近随机,因此硬盘速度将成为瓶颈。但是我希望MongoDB将所有索引加载到RAM中,因为每个节点的总RAM是14GB,并且' top'命令说MongoDB在每个节点上使用大约6GB。索引大小如下:

每个节点:

  • 2id for _id index
  • 1.5rd for shard_key index
  • 3GB for f1 index
  • 3GB for f2 index
  • 总计:所有索引9.5GB

如您所见,总索引大小约为9.5GB,MongoDB使用大约6GB,可用内存为14GB,所以

  1. 添加新索引后性能下降的原因
  2. 如果问题是关于随机访问索引,为什么MongoDB不会在RAM上加载所有索引?
  3. 如何确定每个索引的哪个部分加载到RAM以及哪个部分没有?
  4. 最好的问候

1 个答案:

答案 0 :(得分:0)

  

添加新索引后性能下降的原因

预计索引会降低写入性能,因为每个索引都会增加完成写入所需的工作量。性能下降了多少?您能量化它降低了多少以及可接受的性能变化吗?您能向我们展示一个示例文档并指定您正在创建的索引吗?有些索引的维护成本要高于其他索引。

  

如果问题是关于随机访问索引,为什么MongoDB不会在RAM上加载所有索引?

它将加载正在使用的内容。你怎么知道它没有将索引加载到RAM中?尽管有额外的RAM,你是否看到了很多页面错误?你的WiredTiger缓存大小设置为什么?

  

如何确定每个索引的哪个部分加载到RAM以及哪个部分没有加载?

我不相信有一种简单的方法可以做到这一点。