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

时间:2016-10-24 12:57:09

标签: mongodb performance replication 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)。个人的身份是" val"中的对应索引。阵列。

查询

查询是从val集合中查找val [individual._id]之和的文档 高于个人列表的特定阈值。我们不能预先计算出它的总和 数组,因为个人列表在运行时期间需要更改(我们可能希望获得结果) 例如,只有前2000个人)。此查询使用聚合框架。

我们目前正在做什么:

我们将查询拆分为 100-500子查询,然后将它们 5 x并行

对于pos> gt的文档,第一个子查询将是相同的查询。 0和pos< 50000, 第二个文件,其中pos> 50000和pos< 100000等...

我们希望能够在同一时间运行更多子查询,但我们正面临着 在单个mongod实例上运行超过5时性能损失。

所以问题是:我们应该进行复制还是分片(或两者) 为了在同一时间运行最大数量的子查询?我们怎么配置 mongodb尽可能地在副本/分片之间分派子查询?

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

1 个答案:

答案 0 :(得分:1)

复制是用于数据冗余和高可用性的东西,因此如果您尝试提高查询的性能,我认为我们可以立即将其作为一个选项进行排除。

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

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