【问题标题】:index is not being used未使用索引
【发布时间】:2015-02-07 20:59:53
【问题描述】:

所以我有这个索引

 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
}

【问题讨论】:

标签: mongodb indexing


【解决方案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

您似乎正在对空集合进行查询?

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多