繁体   English   中英

提高mongodb全扫描查询性能:复制还是分片?

[英]Improve mongodb full-scan query performance: replication or sharding?

当前,我们面临着无法避免对集合进行全扫描的情况。 我们已经优化了查询和数据结构,但我们想走得更远,并充分利用分片和复制的优势。

组态

- mongodb version 3.2
- monogo-java-driver 3.2
- storageEngine: wiredTiger
- compression level: snappy
- database size : 6GB

文件结构:

个人收藏

{
    "_id": 1, 
    "name": "randomName1", 
    "info": {...}
}, 
{
    "_id": 2, 
    "name": "randomName2", 
    "info": {...}
},
[...]
{
    "_id": 15000, 
    "name": "randomName15000", 
    "info": {...}
}

价值观集合

{
    "_id": ObjectId("5804d7a41da35c2e06467911"),
    "pos": NumberLong("2090845886852"),
    "val": 
        [0, 0, 1, 0, 1, ... 0, 1]
},
{
    "_id": ObjectId("5804d7a41da35c2e06467912"),
    "pos": NumberLong("2090845886857"),
    "val": 
        [1, 1, 1, 0, 1, ... 0, 0]
}

“ val”数组包含每个元素的一个元素(因此数组的长度最多为15000)。 个人的ID是它在“ val”数组中的对应索引。

询问

查询是从值集合中查找文档,其中val [individual._id]的总和高于特定个体列表的特定阈值。 我们不能仅仅预先计算数组的总和,因为要在运行时更改的个人列表(例如,我们可能只想获取前2000个个人的结果)。 该查询使用聚合框架。

我们目前正在做什么:

我们将查询分为100-500个子查询,并以5乘5并行运行它们。

第一个子查询将对pos> 0且pos <50000的文档进行相同的查询,第二个子查询将对pos> 50000且pos <100000等的文档进行相同的查询。

我们希望能够同时运行更多的子查询,但是当在单个mongod实例上运行5个以上时,我们将面临性能损失。

因此,问题是 :为了同时运行最大数量的子查询,我们应该进行复制还是分片(或同时进行分片)? 我们如何配置mongodb以在副本/分片之间尽可能好地调度子查询?

编辑:让我们假设查询已经完全优化!

复制是一种用于数据冗余和高可用性的东西,因此,如果您想提高查询的性能,我认为我们可以立即排除这种情况。

分片也许是一种选择,但是我认为下一步是发布查询的解释,看看是否有人可以提出建议来提高性能。 可能会做一些您可能错过的调整,或者通过升级当前的MongoDB服务器的RAM或CPU可以看到性能提升。

简而言之,我建议您在进行所有分片工作之前先发布您的解释。

暂无
暂无

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

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