2

来自 MongoDB 文档

如果您有多个字段的复合索引,则可以使用它来查询字段的开始子集。因此,如果您在 a,b,c 上有一个索引,您可以使用它查询 [a] [a,b] [a,b,c]

所以可以说我有这个字段的文档

  1. 用户身份
  2. 姓名
  3. 国家
  4. 外场

我的索引订单是 [UserID,Name,Country]

所以如果我有类似的查询

  var q = (from c in collection.AsQueryable()
                 where c.UserID == UserID
                 where Name = "test"
                 where Country = 1
                 where ExtraField = "check"

                 select c);

此查询是否对前 3 个参数使用索引,然后在没有索引的情况下搜索 ExtraField?

如果是,那么这个查询也一样吗

 var q = (from c in collection.AsQueryable()
                 where c.UserID == UserID                   
                 where ExtraField = "check"

                 select c);
4

1 回答 1

3

这两个问题的答案都是肯定的。

对于您的第一个查询,性能将取决于结果集的选择性。因此,如果索引中的 3 个字段与大量文档匹配,则性能会很慢,因为需要扫描所有这些文档才能在 ExtraField 上进行匹配。如果只匹配几个文档,性能会很快。

现在,如果您的查询根本不包含索引中的第一个字段,则不会使用该索引。例如,以下查询将无法使用索引:

var q = (from c in collection.AsQueryable()
              where Name = "test"
              where Country = 1
              select c);

在此处查看有关在索引中查找其他字段组合的一些有趣事实。

当对此类问题有疑问时,我建议使用 explain 命令。

于 2012-09-05T10:37:16.243 回答