为什么MongoDB查询使用COLLSCAN而不是INDEXSCAN?

mklgxw1f  于 2023-03-29  发布在  Go
关注(0)|答案(1)|浏览(111)

有在名为“taches”的集合上创建的索引

> db.taches.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.taches"
    },
    {
        "v" : 2,
        "key" : {
            "idProjet" : -1
        },
        "name" : "idProjet_-1",
        "ns" : "test.taches"
    },
    {
        "v" : 2,
        "key" : {
            "id" : -1
        },
        "name" : "id_-1",
        "ns" : "test.taches"
    }
]
>

这两个例子表明,这些查询没有使用索引,他们检查了所有的集合文档,不明白为什么?:
x一个一个一个一个x一个一个二个x
多谢了
我尝试了许多索引规则

fjnneemd

fjnneemd1#

在你的示例代码中肯定有一些错误,重新创建你的场景;它按预期工作(IXSCAN):

db.testCollection.drop();
var arr = [...Array(5000).keys()];
var searchIds = [];

var insertManyArray = [];
arr.forEach(item => {
  insertManyArray.push({ id: item + 7000, name: item.toString() })
  if(item % 3 == 0)
    searchIds.push(item)
});

db.testCollection.insertMany(insertManyArray);
db.testCollection.createIndex({id: -1})
db.testCollection.find({id: { $in: searchIds }}).explain()

解释计划

"winningPlan": {
  "stage": "FETCH",
  "inputStage": {
    "stage": "IXSCAN",
    "keyPattern": {
      "id": -1
    },
    "indexName": "id_-1",

相关问题