我们目前面临的情况是我们无法避免进行全扫描收集 . 我们已经优化了查询和数据结构,但我们希望更进一步,充分利用分片和复制 .
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 回答
复制是用于数据冗余和高可用性的东西,因此如果您尝试提高查询的性能,我认为我们可以立即将其作为选项进行排除 .
分片可能是一种选择,但我认为您的下一步是发布您的查询解释,看看是否有人可以提出改善性能的建议 . 它'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 .
简而言之,我建议在进行分片的所有工作之前发布您的解释 .