Mongo复合指数使用较少

我知道在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万个对象,并且它将继续增长,所以我们希望整合我们的索引以节省资源。

非常感谢。


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

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

有关更多信息,请参阅:

  • 优化
  • 索引
  • 查询优化器

  • 事实上,在使用较新的Mongo版本时,当对{a,c}进行查询时必须使用{a,b,c}索引,而对于b而言没有微不足道的条件。 我已经使用explain命令验证了这一点。

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

    链接地址: http://www.djcxy.com/p/9927.html

    上一篇: Mongo compound indexes, using less

    下一篇: Rails 3.1.1 test:benchmark on Ruby 1.9.3