Можно ли указать, какой индекс должен использовать запрос в Mongoid? - PullRequest
5 голосов
/ 30 декабря 2010

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 и title и при сортировке rating использование explain() вместе с hint() в консоли javascript гласит, что использование второго индекса происходит в 4 раза быстрее.

Как я могу сказать Mongoid, чтобы он велел MongoDB использовать второй индекс?

Ответы [ 2 ]

7 голосов
/ 30 декабря 2010

Можно передать такие параметры, как подсказка, 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 может справиться

0 голосов
/ 30 декабря 2010

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

Хотя оптимизатор запросов монго часто работает очень хорошо, можно использовать явные «подсказки», чтобы заставить монго использовать указанный индекс, что потенциально может повысить производительность в некоторых ситуациях.

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

Вам нужно работать с http://www.rdoc.info/github/mongoid/mongoid/master/Mongoid/Cursor здесь, так как я недостаточно знаю Ruby.Упоминается подсказка.

...