当一个索引是另一个索引的子集时,MongoDB似乎使用了低效的查询模式。
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
第一个索引在查询status
,title
和subtitle
以及排序rating
时以及仅查询status
和{时{1}}并在title
上排序,即使在javascript控制台中使用rating
和explain()
也说明使用第二个索引的速度要快4倍。
如何告诉Mongoid告诉MongoDB使用第二个索引?
答案 0 :(得分:7)
您可以使用Mongo::Collection
Mongoid::Criterion::Optional.extras
一个例子:
criteria = Model.where(:status => true, :title => 'hello world').desc(:rating)
criteria.extras(:hint => {:status => 1, :title => 1, :rating => -1})
extras
接受Mongo::Collection可以处理的任何内容
答案 1 :(得分:0)
http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint
虽然经常使用mongo查询优化器 表现得非常好,明确的“提示” 可以用来强迫mongo使用a 指定的指数,有可能改善 在某些情况下的表现。
db.collection.find({user:u, foo:d}).hint({user:1});
你需要在http://www.rdoc.info/github/mongoid/mongoid/master/Mongoid/Cursor工作,因为我对Ruby不够了解。它提到了暗示。