2012-04-24 111 views
1

我正在使用MongoDB 2.0.3(通过Mongoid)和一个红宝石(1.9.3)应用程序。Mongodb查询不使用索引

我有一个看起来一个复合索引,如:

index [ 
    [:attr1, Mongo::ASCENDING], 
    [:attr2, Mongo::ASCENDING], 
    [:attr3, Mongo::ASCENDING], 
    [:attr4, Mongo::ASCENDING] 
] 

而且,看起来像一个查询:

Model.where(:attr3.ne => true, :attr4.ne => true). 
     extras(:hint => { :attr1 => Mongo::ASCENDING, 
         :attr2 => Mongo::ASCENDING, 
         :attr3 => Mongo::ASCENDING, 
         :attr4 => Mongo::ASCENDING }) 

然后我的代码修改的结果,并更新它们。我有几个进程运行上面的红宝石应用程序,所有点击保存mongodb服务器。我有一个相当大的分贝(超过30mil记录,95gb的大小),并不断被我的应用程序读/写。

我看到一个问题,有时查询将使用索引,有时它不会(通过mongo shell中的db.currentOp())。为什么会发生这种情况,我该如何解决?

回答

3

创建多键索引时的顺序很重要 - 如果您的查询中没有包含索引的第一个键(attr1和attr2),那么MongoDB不能使用该索引。想象一下,如果你有一本物理词典,并且你想查找第三个字母是“a”而第四个字母是“b”的单词 - 字典的字母化没有多大帮助。

要查找基于attr3和attr4的文档,您需要一个多键索引,其中attr3和attr4是索引中的第一个键。

+0

感谢您的解释 - 提出了很多意义! – gylaz 2012-04-27 22:51:06