Mongodb查询不使用索引

时间:2012-04-24 01:07:41

标签: ruby mongodb mongoid

我正在使用MongoDB 2.0.3(通过Mongoid)和ruby(1.9.3)应用程序。

我的复合索引如下:

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 })

然后我的代码修改结果并更新它们。我有几个进程运行上面的ruby应用程序,都进入了save mongodb服务器。我有一个相当大的数据库(超过30mil的记录,大小为95gb),并且我的应用程序不断读取/写入。

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

1 个答案:

答案 0 :(得分:3)

创建多键索引时顺序很重要 - 如果在查询中未包含索引的第一个键(attr1和attr2),则MongoDB无法使用索引。想象一下,如果你有一本物理词典,并且想要查找第三个字母是'a'且第四个字母是'b'的单词 - 字典的字母顺序就没那么大了。

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