繁体   English   中英

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

[英]MongoDB write performance drops after adding new index on a sharded collection

我在MongoDB中创建了一个集合,该集合具有四个索引(一个用于_id,一个用于分片的键,以及两个其他索引用于字段f1和f2的查询优化),并且在8节点集群(每个节点具有14GB RAM)上进行分片)。 应用程序写

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

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

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

每个节点:

  • _id索引2GB
  • shard_key索引为1.5GB
  • F1索引3GB
  • f2索引为3GB
  • 总计:所有索引9.5GB

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

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

最好的祝福

为什么添加新索引后性能下降

预计索引会降低写入性能,因为每个索引都会增加完成写入所需的工作量。 性能会降低多少? 您能否量化它的降级程度以及可以接受的性能变化? 您能给我们看一个示例文档并指定您要创建的索引吗? 一些索引的维护成本比其他索引高得多。

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

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

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

我认为没有简单的方法可以做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM