我正在使用 mongodb 2.6,我有以下查询: db.getCollection('Jobs').find({ $and: [ { RunID: { $regex: ".*_0" } }, { $or: [ { JobType: "TypeX" }, { JobType: "TypeY" }, { JobType: "TypeZ" }, { $and: [ { Info: { $regex: "Weekly.*" } },
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或RunID JobType字段,info here:
In addition to supporting queries that match on all the index fields,
compound indexes can support queries that match on the prefix of the
index fields.
当您删除这些索引时,mongo将选择唯一保留的索引.
笔记2:
你可以随时使用hint,告诉mongo使用特定的索引:
db.getCollection('Jobs').find().hint({RunID:1, JobType:1, Info:1})