1

我正在使用带有 ruby​​ (1.9.3) 应用程序的 MongoDB 2.0.3(通过 Mongoid)。

我有一个看起来像这样的复合索引:

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​​ 应用程序的进程,所有进程都在保存 mongodb 服务器。我有一个相当大的数据库(超过 3000 万条记录,大小为 95gb),并且我的应用程序不断地对其进行读取/写入。

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

4

1 回答 1

3

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

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

于 2012-04-24T14:40:53.487 回答