2016-10-24 65 views
0

我们目前面临的情况是,我们无法避免进行全套扫描收集 。我们已经优化了查询和数据结构,但是我们想要更进一步并充分利用分片和复制。提高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尽可能地在副本/分片之间分派子查询?

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

回答

1

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

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

总之,我会建议发布你的解释之前,去分片的所有努力。

+0

感谢您的回答!也许我会在其他问题中发布解释,但暂时让我们假设查询已经足够优化了,我们该怎么做? – felix