我们目前面临的情况是我们无法避免收集 全扫描。我们已经优化了查询和数据结构,但我们已经 我想进一步充分利用分片和复制。
配置
- 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尽可能地在副本/分片之间分派子查询?
编辑:我们假设查询已经完全优化了!
答案 0 :(得分:1)
复制是用于数据冗余和高可用性的东西,因此如果您尝试提高查询的性能,我认为我们可以立即将其作为一个选项进行排除。
分片可能是一个选项,但我认为您的下一步是发布查询的解释,看看是否有人可以提出改进性能的建议。您可能会错过一些调整,或者通过升级当前的MongoDB服务器的RAM或CPU可能会看到性能提升。
简而言之,我建议在进行分片的所有工作之前发布您的解释。