当您查询两个字段时会发生什么,因为它们不是复合索引的一部分,例如:
db.collection.ensureIndex( { a: 1 } )
db.collection.ensureIndex( { b: 1 } )
db.collection.find( { a: 2, b: 2 } )
我想知道是否可能会扫描许多文档,或者 Mongo DB 是否不会扫描任何内容并且explain()
会返回:
indexOnly: YES
当您查询两个字段时会发生什么,因为它们不是复合索引的一部分,例如:
db.collection.ensureIndex( { a: 1 } )
db.collection.ensureIndex( { b: 1 } )
db.collection.find( { a: 2, b: 2 } )
我想知道是否可能会扫描许多文档,或者 Mongo DB 是否不会扫描任何内容并且explain()
会返回:
indexOnly: YES
indexOnly
只有当您要查找的所有值都在索引中(包括排序)时,解释才会返回。基本上它表示一个覆盖索引:http ://docs.mongodb.org/manual/applications/indexes/#create-indexes-that-support-covered-queries
在这种情况下,您通过两个字段进行查询,但其中只有一个在一个单独的索引中。
考虑到 MongoDB 不能对单个子句使用多个索引($or
这是一个例外,因为它是多子句,它也与普通查询不同)它不会执行indexOnly
查询,而是会通过索引搜索集合a
然后执行对包含b
在该范围内的文档进行完整文档扫描,以了解其值并返回结果。
还要注意,要indexOnly
正确使用游标,您应该使查询的以下部分适合单个索引:
IE:
db.ensureIndex({a:1,b:1});
db.col.find({a:1}, {_id:0,a:1,b:1}).sort({b:1});
会使用indexOnly
游标。