Mongodb 为什么Mongo查询忽略索引

Mongodb 为什么Mongo查询忽略索引,mongodb,Mongodb,我的mongo集合中有两个索引 [{ "v" : 1, "key" : { "updated" : 1, "type" : 1 }, "name" : "index_1", "ns" : "abacus.cps" }, { "v" : 1, "key" : { "type" : 1, "site_name" : 1, "language" : 1, "firstPublished" : -1, "wordcoun

我的mongo集合中有两个索引

[{
  "v" : 1,
  "key" : {
    "updated" : 1,
    "type" : 1
  },
  "name" : "index_1",
  "ns" : "abacus.cps"
},
{
  "v" : 1,
  "key" : {
    "type" : 1,
    "site_name" : 1,
    "language" : 1,
    "firstPublished" : -1,
    "wordcount" : 1
  },
  "name" : "index_2",
  "ns" : "abacus.cps"
}]
当我用以下命令查询数据库时

db.cps.find({ updated: { $gte: new Date(1563104071535) }, type: "STY"}).explain()
它支持
索引2
。即使我使用
hint()
强制查询使用
index\u 1
,它的性能仍然很差。在如何使这个索引和查询性能方面,我有什么误解吗

编辑1:使用解释结果更新

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "abacus.cps",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [
                {
                    "type" : {
                        "$eq" : ""
                    }
                },
                {
                    "updated" : {
                        "$gte" : ISODate("2019-07-14T11:34:31.535Z")
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "filter" : {
                "updated" : {
                    "$gte" : ISODate("2019-07-14T11:34:31.535Z")
                }
            },
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "type" : 1,
                    "site_name" : 1,
                    "language" : 1,
                    "firstPublished" : -1,
                    "wordcount" : 1
                },
                "indexName" : "type_1_site_name_1_language_1_firstPublished_-1_wordcount_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "type" : [ ],
                    "site_name" : [ ],
                    "language" : [ ],
                    "firstPublished" : [ ],
                    "wordcount" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "forward",
                "indexBounds" : {
                    "type" : [
                        "[\"\", \"\"]"
                    ],
                    "site_name" : [
                        "[MinKey, MaxKey]"
                    ],
                    "language" : [
                        "[MinKey, MaxKey]"
                    ],
                    "firstPublished" : [
                        "[MaxKey, MinKey]"
                    ],
                    "wordcount" : [
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [
            {
                "stage" : "FETCH",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "updated" : 1,
                        "type" : 1
                    },
                    "indexName" : "updated_1_type_1",
                    "isMultiKey" : false,
                    "multiKeyPaths" : {
                        "updated" : [ ],
                        "type" : [ ]
                    },
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 1,
                    "direction" : "forward",
                    "indexBounds" : {
                        "updated" : [
                            "[new Date(1563104071535), new Date(9223372036854775807)]"
                        ],
                        "type" : [
                            "[\"\", \"\"]"
                        ]
                    }
                }
            }
        ]
    },
    "ok" : 1
}

索引2优于索引1的原因是,在索引1中,第一个字段是“更新”的,并且您正在“更新”字段上使用范围查询($gte)

而索引2有第一个字段“type”,您正在对字段“type”执行相等查询。相等比范围操作具有更多的优先权

您的索引1应按顺序排列:

{
    "type" : 1,
    "updated" : 1
}

索引2优于索引1的原因是,在索引1中,第一个字段是“更新”的,并且您正在“更新”字段上使用范围查询($gte)

而索引2有第一个字段“type”,您正在对字段“type”执行相等查询。相等比范围操作具有更多的优先权

您的索引1应按顺序排列:

{
    "type" : 1,
    "updated" : 1
}

你能分享一下解释计划吗?你能分享一下解释计划吗?很好,谢谢,我忘记了在创建复合索引时,键的顺序很重要。很好,谢谢,我忘记了在创建复合索引时,键的顺序很重要。