Mongo复合索引,在查询中使用少于全部

Chr*_*ris 7 mongodb

我理解使用MongoDB,对于使用复合索引的查询,它必须使用索引中的所有键,或者至少从左侧开始的一些键.例如

db.products.find({ "a":"foo", "b":"bar" })
Run Code Online (Sandbox Code Playgroud)

很乐意使用由{a,b,c}组成的索引.

但是,如果我想查询:

db.products.find( {"a":"foo", "c":"thing" })
Run Code Online (Sandbox Code Playgroud)

我相信这不能使用索引.这可以通过在"b"上添加一个微不足道的条件来解决,例如

db.products.find( {"a":"foo", "b":{ $ne : "" }, "c":"thing" })
Run Code Online (Sandbox Code Playgroud)

即使我实际上并不关心b的价值.这样做的原因是我们目前拥有4500个对象,并且它将继续增长,因此我们希望整合我们的索引以节省资源.

非常感谢.

Dan*_*ruz 3

一般来说,对多列索引的查询如果没有充分限制其中一列的匹配,将会限制多列索引的有用性。在您的示例中,使用 的查询条件{"a":"foo", "b":{$ne:""}, "c":"thing"}会将索引的有用性限制{a,b,c}为仅匹配a。如果您的查询条件将经常执行,请创建{a,c,b}索引(或者{a,c}如果b不会在查询条件中使用)。

在查询中使用该explain函数可以查看索引是否充分发挥其潜力。如果explain告诉你indexOnlyis true,那么你的查询只是使用索引来查找匹配的文档;否则,MongoDB 需要查看每个文档来查找匹配项。

欲了解更多信息,请参阅: