1

私はMongoDB2.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アプリケーションを実行しているプロセスがいくつかあり、すべてsavemongodbサーバーにアクセスしています。私はかなり大きなデータベース(30milレコード以上、サイズ95GB)を持っており、アプリによって常に読み取り/書き込みが行われています。

クエリがインデックスを使用する場合と使用しない場合があるという問題が発生しています(mongoシェルのdb.currentOp()を使用)。なぜそれが起こっているのですか、どうすれば修正できますか?

4

1 に答える 1

3

マルチキーインデックスを作成するときは順序が重要です。クエリにインデックスの最初のキー(attr1とattr2)を含めないと、MongoDBはインデックスを使用できません。物理的な辞書があり、3番目の文字が「a」で4番目の文字が「b」の単語を検索したい場合を想像してみてください。辞書のアルファベット順はあまり役に立ちません。

attr3とattr4に基づいてドキュメントを検索するには、attr3とattr4がインデックスの最初のキーであるマルチキーインデックスが必要です。

于 2012-04-24T14:40:53.487 に答える