首页 文章

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

提问于
浏览
0

我们目前面临的情况是我们无法避免进行全扫描收集 . 我们已经优化了查询和数据结构,但我们希望更进一步,充分利用分片和复制 .

Configuration

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

Documents structure:

个人收藏

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

Value 收集

{
    "_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”数组中的相应索引 .

Query

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

What we're currently doing:

我们在 100-500 subqueries 中拆分查询并运行它们 5 by 5 in parallel .

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

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

So the question is :为了在同一时间运行最大数量的子查询,我们应该进行复制还是分片(或两者)?我们如何配置mongodb以尽可能最好地在副本/分片之间分派子查询?

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

1 回答

  • 1

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

    分片可能是一种选择,但我认为您的下一步是发布您的查询解释,看看是否有人可以提出改善性能的建议 . 它's possible there is some tuning your could do that you missed, or perhaps you would see performance gains by upgrading the current MongoDB server'的RAM或CPU .

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

相关问题