首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB复合索引性能

MongoDB复合索引性能
EN

Stack Overflow用户
提问于 2016-03-23 18:23:50
回答 1查看 363关注 0票数 0

我在理解复合索引的基本概念时遇到了麻烦。假设我有一个具有此模式的集合:

代码语言:javascript
复制
{
    _id: 1,
    field1: 'aaa',
    field2: 'bbb',
    field3: 'ccc'
}

https://docs.mongodb.org/manual/core/index-compound/中,它清楚地说明了,而且我理解,这个索引:{ field1: 1, field: 2}将只支持在field1和两个field1 AND field2上的查询,这是有意义的。

现在,如果我想要支持对所有字段(1,2和3)的查询,其中字段1总是被使用,该怎么办?我想支持在所有field1 AND field2 AND field3上查询field1 AND field2field1 AND field3的选项。

我知道可以为这些查询选项中的每一个创建复合索引,但问题是是否可以使用更少的复合来在相同的性能下进行查询。

例如,如果我有一个索引:{field1: 1, field2: 1, field3: 1},并且我查询field1 AND field3,它将使用这个索引,但是field2上的索引边界将是"[MinKey, MaxKey]"。是否值得创建另一个索引:{field1: 1, field3: 1}

EN

回答 1

Stack Overflow用户

发布于 2016-03-23 18:44:23

如果您尝试创建一个包含这些文档和索引的集合,然后对查询执行explain,mongo将选择索引:{field1: 1, field3: 1}并拒绝其他计划。这表明mongo发现一个索引比另一个索引更可取。

例如,explain返回以下内容:

代码语言:javascript
复制
"winningPlan" : {
    "stage" : "FETCH",
    "inputStage" : {
        "stage" : "IXSCAN",
        "keyPattern" : {
            "field1" : 1,
            "field3" : 1
        },
        "indexName" : "field1_1_field3_1",
        "isMultiKey" : false,
        "isUnique" : false,
        "isSparse" : false,
        "isPartial" : false,
        "indexVersion" : 1,
        "direction" : "forward",
        "indexBounds" : {
            "field1" : [
                "[\"aaa\", \"aaa\"]"
            ],
            "field3" : [
                "[\"ccc\", \"ccc\"]"
            ]
        }
    }
},
"rejectedPlans" : [
    {
        "stage" : "FETCH",
        "filter" : {
            "field3" : {
                "$eq" : "ccc"
            }
        },
        "inputStage" : {
            "stage" : "IXSCAN",
            "keyPattern" : {
                "field1" : 1,
                "field2" : 1
            },
            "indexName" : "field1_1_field2_1",
            "isMultiKey" : false,
            "isUnique" : false,
            "isSparse" : false,
            "isPartial" : false,
            "indexVersion" : 1,
            "direction" : "forward",
            "indexBounds" : {
                "field1" : [
                    "[\"aaa\", \"aaa\"]"
                ],
                "field2" : [
                    "[MinKey, MaxKey]"
                ]
            }
        }
    },
    {
        "stage" : "FETCH",
        "inputStage" : {
            "stage" : "IXSCAN",
            "keyPattern" : {
                "field1" : 1,
                "field2" : 1,
                "field3" : 1
            },
            "indexName" : "field1_1_field2_1_field3_1",
            "isMultiKey" : false,
            "isUnique" : false,
            "isSparse" : false,
            "isPartial" : false,
            "indexVersion" : 1,
            "direction" : "forward",
            "indexBounds" : {
                "field1" : [
                    "[\"aaa\", \"aaa\"]"
                ],
                "field2" : [
                    "[MinKey, MaxKey]"
                ],
                "field3" : [
                    "[\"ccc\", \"ccc\"]"
                ]
            }
        }
    }
]

然而,这里存在索引大小的问题,以及您要创建的所有索引是否都可以与数据库工作集一起放入RAM中。如果它们没有,那么它将在磁盘上保存索引,这将大大减慢读取速度。最好的折衷办法是在所有三个字段上都使用索引,因为这总比没有索引好,而且涉及的维护工作也比三个索引少

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36175485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档