2012-04-24 18 views
1

私はRuby(1.9.3)アプリケーションでMongoDB 2.0.3(Mongoid経由)を使用しています。インデックスを使用しない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 }) 

はその後、私のコードは、結果を修正し、それらを更新します。私は上記のrubyアプリケーションを実行するいくつかのプロセスを持っており、すべてmongodbサーバを保存しています。私は非常に大規模なデータベース(30milのレコード、95gbのサイズ以上)を持っており、常に私のアプリケーションで読み書きされています。

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

答えて

3

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

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

+0

説明をいただきありがとうございます。 – gylaz

関連する問題