【问题标题】:MongoDB Drive C# Index not used未使用 MongoDB Drive C# 索引
【发布时间】:2020-03-24 20:19:03
【问题描述】:

在 MongoDB 中:

db.estr.createIndex({_id:1, Atualizar:-1});

在 C# 中

var a = await db.dados.Distinct(x=>x.codigo).toListAsync();
var b = await db.estr.find(x=>!a.contains(x._id) && x.Atualizar).toListAsync();

索引统计

{
    "name" : "_id_1_Atualizar_-1",
    "key" : {
        "_id" : 1.0,
        "Atualizar" : -1.0
    },
    "host" : "OMNIIS2012HOM:27017",
    "accesses" : {
        "ops" : NumberLong(0), <----- not utilizade
        "since" : ISODate("2020-03-24T11:00:25.011-03:00")
    }
}

在 MongoDB 上进行搜索,未调用索引 x.Atualizar 是布尔型

【问题讨论】:

    标签: c# mongodb indexing


    【解决方案1】:

    您的查询正在对索引规范中的第一个字段进行不等式匹配,因此它必须扫描整个索引,并且对于满足查询的每个 _id 值,检查匹配的 Atualizar 值。在许多情况下,这会比集合扫描执行得更差,因此可能永远不会使用索引。

    如果您要交换索引中字段的顺序,即

    db.estr.createIndex({Atualizar:-1, _id:1})
    

    查询执行器将能够从第一个匹配Atualizar 的键开始扫描,并选择所有匹配的文档,扫描两次_id 值。这应该会执行得更好,所以查询规划器应该选择这个索引。

    请注意,对于所有文档都可以放入 RAM 的非常小的数据集,集合扫描通常是最快的。

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2022-09-28
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多