我理解使用MongoDB,对于使用复合索引的查询,它必须使用索引中的所有键,或者至少从左侧开始的一些键。例如
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 :(得分:3)
通常,对多列索引的查询不足以限制其中一列的匹配将限制多列索引的有用性。在您的示例中,使用{"a":"foo", "b":{$ne:""}, "c":"thing"}
的查询条件会限制{a,b,c}
索引仅在a
上匹配的有用性。如果您的查询条件会经常执行,请创建{a,c,b}
索引(如果{a,c}
不在查询条件中使用,则为b
。)
在查询中使用explain
函数查看索引是否正在充分发挥其潜力。如果explain
告诉您indexOnly
为true
,那么您的查询仅使用索引来查找匹配的文档;否则,MongoDB需要查看每个文档以查找匹配项。
有关详细信息,请参阅:
答案 1 :(得分:0)
事实上,使用较新的Mongo版本时,如果{a,c}上有查询而且b上没有必要的条件,则会使用{a,b,c}索引。我已经使用explain命令验证了这一点。
这里有详细的讨论:Mongo Triple Compound Index