【发布时间】:2017-03-06 06:27:19
【问题描述】:
我们目前面临无法避免收集的情况 全扫描。我们已经优化了查询和数据结构,但是我们 想走得更远,充分利用分片和复制。
配置
- 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] 的总和为 超过个人名单的特定门槛。我们不能只预先计算 数组,因为在运行时需要更改的个人列表(我们可能希望得到结果 例如,仅前 2000 个人)。此查询使用聚合框架。
我们目前在做什么:
我们将查询拆分为 100-500 个子查询,然后5 x 5 并行运行它们。
第一个子查询将是对 pos > 0 和 pos 50000 和 pos
我们希望能够同时运行更多子查询,但我们面临 在单个 mongod 实例上运行超过 5 个时性能损失。
所以问题是:我们应该在 为了同时运行最大数量的子查询?我们该如何配置 mongodb 尽可能在副本/分片之间分派子查询?
编辑:假设查询已经完全优化!
【问题讨论】:
标签: mongodb performance replication sharding