索引未被使用

时间:2015-02-07 20:59:53

标签: mongodb indexing

所以我有这个索引

 db.contact.ensureIndex(
 {
   'first_name':1,
   'last_name':1,
   'company_name':1,
   'title':1,
   'email':1,
   'phone_number':1,
   'state':1,
   'list_id':1
});

如果我使用$or运行此查询,则索引未被使用

 db.contact.find(
                {
                  $or: [
                          {'first_name':/sales/i},
                          {'last_name':/sales/i},
                          {'company_name':/sales/i},
                          {'title':/sales/i},
                          {'email':/sales/i},
                          {'phone_number':/sales/i},
                          {'state':/sales/i}
                  ] 
                }).explain();

输出:

{
    "cursor" : "BasicCursor", //Btree Index not being used !?
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 0,
    "nscanned" : 0,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 0,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "server" : "",
    "filterSet" : false
}

1 个答案:

答案 0 :(得分:1)

给出以下文档:

(1){first_name: 'sales', last_name: 'something', company_name: 'something'},
(2){first_name: 'something', last_name: 'sales', company_name: 'something'},
(3){first_name: 'something', last_name: 'something', company_name: 'sales'}

您希望在结果中获得所有这些内容 因此,如果mongodb使用{first_name:1,last_name:1,company_name:1})索引,它将自动排除记录第二和第三,因为在这两种情况下first_name是不同的。因此,为了获得剩余的文档,您无论如何都必须扫描所有文档。

PS

看来你是在查询空集合吗?