2015-04-12 144 views
0

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

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

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

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

每个节点:

  • 2GB的_id指数
  • 1.5GB的shard_key指数
  • 3GB的F1指数
  • 3GB用于f指数
  • 总:所有指数均为9.5GB

正如您所看到的,总指数s IZE约为9.5GB,MongoDB是使用6GB左右,且可用RAM为14GB,因此

  1. 为什么添加新的索引
  2. 后的性能下降。如果问题是指数约随机访问,为什么不的MongoDB不加载RAM上的所有索引?
  3. 我怎样才能确定每个索引的哪一部分被加载到RAM中,哪一部分没有被加载?

问候

回答

0

为什么

它的预期,指数缓慢写入性能,因为每个指标增加工作需要完成写入量增加新指标后的性能下降。性能下降多少?你能量化它降低多少,性能改变是可以接受的吗?你能向我们展示一个示例文档并指定你正在创建的索引是什么?一些索引比其他索引维护成本高得多。

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

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

我该如何确定每个索引的哪一部分被加载到RAM中,哪部分没有?

我不相信有一个简单的方法来做到这一点。