MongoDB选择了错误的索引

时间:2016-03-24 19:18:35

标签: mongodb

我有一个名为test的MongoDB集合,其中包含以下两个简单文档:

    {
        "first_name" : "John",
        "last_name" : "Smith",
        "age" : 25
    }
    {
        "first_name" : "James",
        "last_name" : "Bond",
        "age" : 31
    }

我还为这个集合创建了以下索引:

    {
        "first_name" : 1
    }
    {
        "last_name" : 1
    }
    {
        "age" : 1
    }
    {
        "first_name" : 1,
        "last_name" : 1,
        "age" : 1
    }

以下查询使用其对应的字段索引:

db.getCollection('test').find({first_name: 'John'});
db.getCollection('test').find({last_name: 'Smith'});
db.getCollection('test').find({age: 25});

但是当我执行以下查询时:

db.getCollection('test').find({first_name: 'John', last_name: 'Smith', age: 25});

它使用字段last_name的单个索引,而不是包含所有三个字段的复合索引。

http://www.binaryconvert.com/convert_signed_int.html?hexadecimal=0017A8A6

关于这个问题的任何想法/参考?
MongoDB版本:3.0.7

由于

1 个答案:

答案 0 :(得分:2)

MongoDB查询规划器决定哪个索引对于给定查询最有效(同样,从MongoDB 2.6开始,它可以获取多个索引)。 Query planner documentation详细解释了它。

如果您希望它为最后一个查询选择3键复合索引,您有两个选择:

  1. 使此决策结果的查询执行时间更快。基本上,您需要比仅3个文档大一些数量级的文档集大小。
  2. 在光标上使用hint()。您需要将索引名称作为hint方法的参数传递,您可以从collection.getIndexes()命令输出中找到该参数。