索引未被使用
index is not being used
所以我有这个索引
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){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
您似乎正在运行针对空集合的查询?
所以我有这个索引
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){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
您似乎正在运行针对空集合的查询?