3

我有一个名为stocks 的集合,我在其上创建了一个复合索引,如下所示

db.stocks.ensureIndex({"symbol":1,"date":1,"type": 1, "isValid": 1,"rootsymbol":1,"price":1},{"unique" : false})

我设置了 profilinglevel,找出所有慢查询。

下面的一个查询花了38毫秒,什么时候解释过,这是下面的结果

抱歉,我已经更新了我的问题

db.stocks.find({ query: { symbol: "AAPLE", date: "2014-01-18", type: "O", isValid: true }, orderby: { price: "1" } }).explain();
{
        "cursor" : "BasicCursor",
        "nscanned" : 705402,
        "nscannedObjects" : 705402,
        "n" : 0,
        "millis" : 3456,
        "indexBounds" : {

        }
}

我的问题是为什么它显示一个 BasicCursor 即使它上面有索引?

4

3 回答 3

4

我很确定这里的问题是您对该find()功能的使用。您正在指定一个query参数并在其中放置您的搜索条件。我认为你不需要真正投入query其中。只需插入您的搜索条件。像这样的东西:

db.stocks.find({ 
  symbol: "AAPLE", 
  date: "2014-01-18", 
  type: "O", 
  isValid: true 
}).sort( { "price": 1} ).explain();

还要注意我对排序的更改。您可以在此处阅读有关对光标进行排序的更多信息。

于 2013-09-10T15:49:13.050 回答
1

由于这个问题实际上并没有被描述,我将继续描述它。

您正在使用功能运算符调用顶级查询运算符。因此,例如,您在这里调用查询运算符:

{ query: { symbol: "AAPLE", date: "2014-01-18", type: "O", isValid: true }, orderby: { price: "1" } }

queryand的形式orderby调用函数运算符:

explain();

这是 MongoDB 的一个已知错误,这两者不能很好地配合使用,因此会产生您获得的输出。

当然,当查询进入并由 MongoDB 解析时,它会使用查询运算符等记录在配置文件query中。orderbymaxscan

这在调用命令时更成问题。

参考:MongoDB $query 运算符忽略索引?我找不到实际的 JIRA,但这是相关的。

编辑:我认为这模糊地代表了它:https ://jira.mongodb.org/browse/SERVER-6767

于 2013-09-10T17:09:41.043 回答
0

语法不是问题。为了让 MongoDB 使用复合索引(即包含多个字段的索引),查询/排序中的字段必须是索引字段的前缀。在这种情况下,您的索引包括以下字段:symbol、date、type、isValid、rootsymbol 和 price。您的查询/排序包括除 之外 的所有字段rootsymbol,因此无法使用索引。可能的解决方案:

  • rootsymbol从索引中删除,或
  • 添加rootsymbol到您的查询中,或
  • 如果您不能执行上述任何一项,请创建另一个索引rootsymbol

参考

关于语法,实际上有一种查询语法不能使用索引:$where子句需要评估内联 JavaScript,因此不能使用索引。例如:

db.collection.find( { $where: "field1.value > field2.value" } )
于 2013-09-10T16:12:41.370 回答