我正在使用mongodb 2.6
,我有以下查询:
db.getCollection('Jobs').find(
{ $and: [ { RunID: { $regex: ".*_0" } },
{ $or: [ { JobType: "TypeX" },
{ JobType: "TypeY" },
{ JobType: "TypeZ" },
{ $and: [ { Info: { $regex: "Weekly.*" } }, { JobType: "YetAnotherType" } ] } ] } ] })
我有三个不同的索引:
RunID
,RunID + JobType
,RunID + JobType + Info
。mongo总是只使用包含runid的索引,尽管其他索引似乎更可能产生更快的结果,但它有时甚至使用包含RunID + StartTime
的索引,而starttime甚至不在已用字段列表中,知道它为什么选择该索引吗? 最佳答案
注1:
您可以删除前两个索引RunID
和RunID + JobType
。只使用扩展的复合索引就足够了;它还可以用于查询RunID + JobType + Info
或RunID
字段,info here:
除了支持匹配所有索引字段的查询之外,
复合索引可以支持与
索引字段。
当您删除这些索引时,mongo将选择剩下的唯一索引。
注2:
您始终可以使用hint,告诉mongo使用特定索引:
db.getCollection('Jobs').find().hint({RunID:1, JobType:1, Info:1})