我们目前面临的情况是,我们无法避免进行全套扫描收集 。我们已经优化了查询和数据结构,但是我们想要更进一步并充分利用分片和复制。提高mongodb全扫描查询性能:复制还是分片?
配置
- 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]是 为idividuals的列表中选择特定treshold以上。我们不能仅仅预先计算 数组的总和,因为在运行期间个人想要更改的列表(例如,我们可能想要得到 的结果,例如只有前2000个人)。该查询使用聚合框架。
我们目前正在做的:
我们一分为100-500子查询查询,并通过5并行运行它们5。
第一个子查询将是文件相同的查询若pos> 0和POS < 50000, 第二的文档若pos> 50000个POS < 100000等...
我们希望能够要在同一时间运行更多的子查询,但在单个mongod实例上运行超过5个时,我们会面临 的性能损失。
所以,问题是:我们应该去复制或在 为了运行在相同的时间子查询的最大数量分片(或两者兼有)?我们如何配置 mongodb尽可能地在副本/分片之间分派子查询?
编辑:让我们假设查询已经完全优化!
感谢您的回答!也许我会在其他问题中发布解释,但暂时让我们假设查询已经足够优化了,我们该怎么做? – felix