2010-12-29 1 views
5

MongoDBは、あるインデックスが別のインデックスのサブセットである場合、非効率的なクエリパターンを使用しているようです。クエリがMongoidで使用するインデックスを指定することはできますか?

class Model 
    field :status, :type => Integer 
    field :title, :type => String 
    field :subtitle, :type => String 
    field :rating, :type => Float 

    index([ 
    [:status, Mongo::ASCENDING], 
    [:title, Mongo::ASCENDING], 
    [:subtitle, Mongo::ASCENDING], 
    [:rating, Mongo::DESCENDING] 
    ]) 
    index([ 
    [:status, Mongo::ASCENDING], 
    [:title, Mongo::ASCENDING], 
    [:rating, Mongo::DESCENDING] 
    ]) 
end 

最初のインデックスは両方の場合statustitlesubtitleに照会し、ratingにソートしたときだけstatustitle上照会してもJavaScriptコンソール状態においてhint()とともにexplain()を使用してもratingのソートに使用されています2番目のインデックスを使用すると4倍高速です。

MongoDBに2番目のインデックスを使用するようにMongoidに指示するにはどうすればよいですか?

答えて

7

あなたはMongoid::Criterion::Optional.extras

に例を使用してMongo::Collectionに、このようなヒントなどのオプションを渡すことができます。

criteria = Model.where(:status => true, :title => 'hello world').desc(:rating) 
criteria.extras(:hint => {:status => 1, :title => 1, :rating => -1}) 

extrasは私がMongoid ::カーソルがあるかわからないMongo::Collection

+0

笑、面白いです。私の知る限り、mongodbは1つのインデックスしか使用できませんでした。ヒント値にハッシュを入れた理由を少し混乱させます – Ph0en1x

+0

ハッシュヒント値は[[:ステータス、Mongo :: ASCENDING]、[:title、Mongo :: ASCENDING]、[:rating、Mongo: :DESCENDING]] index、それはまだ単一のインデックス –

+0

を使用しているので、それはcompaundインデックスですか?ステータス、タイトル、および評価から。さて、私は参照してください。 – Ph0en1x

0

http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint

のmongoクエリオプティマイザは、多くの場合、 行い、非常によく、明示的な「ヒント」 は、潜在的にいくつかの状況で パフォーマンスを向上させること、 指定されたインデックスを使用するようにモンゴを強制するために使用することができますが。私は十分なルビーを知らないよう

db.collection.find({user:u, foo:d}).hint({user:1});

現在地http://www.rdoc.info/github/mongoid/mongoid/master/Mongoid/Cursorから作業する必要があります。それはヒントを言います。

+0

を扱うことができるものを受け入れます正しいパス。ヒントはMongo :: Cursorにヒントを委譲します。ヒントはreadonly属性です。 –

関連する問題