【问题标题】:Improve mongodb full-scan query performance: replication or sharding?提高 mongodb 全扫描查询性能:复制还是分片?
【发布时间】: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


    【解决方案1】:

    复制用于数据冗余和高可用性,所以如果您想提高查询的性能,我认为我们可以立即将其排除在外。

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

    简而言之,我建议在进行分片之前发布您的解释。

    【讨论】:

    • 感谢您的回答!也许我会在另一个问题中发布解释,但目前让我们假设查询已经足够优化,我们应该怎么做?
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多