2011-11-02 59 views
7

我知道,使用MongoDB时,对于使用复合索引的查询,它必须使用索引中的所有键或至少一些键从左边开始。例如Mongo复合索引,在查询中使用少于全部

db.products.find({ "a":"foo", "b":"bar" }) 

将愉快地使用索引的制成的{A,B,C}。

但是,如果我要查询:

db.products.find({"a":"foo", "c":"thing" }) 

我认为这不能使用索引。这可以通过在“b”上添加一个微不足道的条件来解决,例如

db.products.find({"a":"foo", "b":{ $ne : "" }, "c":"thing" }) 

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

非常感谢。

+0

你能解释一下这些查询吗? –

+0

你的理解在双重复合指数中是严格正确的,但在三重复合指数中不一定是正确的。使用解释你将会看到,当你在a,c上查询时,实际上会使用a,b,c索引。 –

回答

3

通常,对多列索引的查询不足以限制其中一列的匹配将限制多列索引的实用性。在您的示例中,使用{"a":"foo", "b":{$ne:""}, "c":"thing"}的查询条件将限制{a,b,c}索引仅用于匹配a的实用性。如果您的查询条件将经常执行,请创建{a,c,b}索引(或{a,c},如果b不会用于查询条件)。

在查询中使用explain函数来查看是否正在充分利用索引。如果explain告诉你indexOnlytrue,那么你的查询只使用索引来查找匹配的文档;否则,MongoDB需要查看每个文档以查找匹配项。

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

0

事实上,使用较新的蒙戈的版本,您的{A,B,C}指数将当对{a,c}进行查询时必须使用b上的无关紧要条件。我已经使用explain命令验证了这一点。

这里有一个详细的讨论:Mongo Triple Compound Index