Правильно ли использование индекса предотвратит так много запросов? - PullRequest
1 голос
/ 02 марта 2012

Я использую MongoDB (с Mongoid), запрос, который действительно очень часто выполняется в моем приложении, я не уверен, что у меня установлены правильные индексы, чтобы сделать запросы более эффективными, вот фрагмент из моего журнала, когдазапрос выполняется:

MONGODB (33ms) recipes_development['system.namespaces'].find({})
MONGODB (6ms) recipes_development['recipes'].find({})
MONGODB (0ms) recipes_development['system.namespaces'].find({})
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48469d4064241d860002d9')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48469d4064241d8600032a')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48469a4064241d8600008d')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48469c4064241d86000273')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48469d4064241d86000365')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f4846a34064241d86000910')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48499a4064241c58000027')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48499a4064241c58000027')}).limit(-1).sort([[:created_at, :desc]])
MONGODB (0ms) recipes_development['users'].find({:_id=>BSON::ObjectId('4f48499a4064241c58000027')}).limit(-1).sort([[:created_at, :desc]])
... many more ...

Как я могу сделать это более эффективным, или поведение, которое я вижу, типично?

Обновление

Таким образом, я получаю эти записи с помощью следующих областей:

scope :active, where(:active => true)
default_scope order_by([:created_at, :desc])

Затем я устанавливаю переменную экземпляра в моем контроллере таким образом:

@users = User.active

1 Ответ

1 голос
/ 03 марта 2012

Похоже, что это проблема N + 1, и вы можете исправить ее с помощью активной загрузки. Объяснение нетерпеливой загрузки в Mongo для mongo mapper можно найти здесь (поиск «Стремительная загрузка»):

...