MongoDB избыточные запросы к коллекции system.namespaces? - PullRequest
2 голосов
/ 15 ноября 2011

Итак, я уже некоторое время использую MongoDB (с Mongoid Ruby Gem), и, по мере роста нашего приложения, я заметил, что запросы растут все дольше и дольше по мере роста моих данных, вот что типично для запроса мое приложение выглядит, но это занимает около 500 мс, просто для базы данных.

Ничего особенного, только некоторые элементы контроллера:

Started GET "/cities/san-francisco?date_range=past_week" for 127.0.0.1 at 2011-11-15 11:13:04 -0800
  Processing by CitiesController#show as HTML
  Parameters: {"date_range"=>"past_week", "id"=>"san-francisco"}

Затем выполняются запросы, но я не понимаю, что для каждого запускаемого запроса он выполняет MONGODB dashboard_development['system.namespaces'].find({}) перед его выполнением! Почему?

MONGODB dashboard_development['system.namespaces'].find({})
MONGODB dashboard_development['users'].find({:_id=>BSON::ObjectId('4e80e0090f6d2e306f000001')})
MONGODB dashboard_development['system.namespaces'].find({})
MONGODB dashboard_development['cities'].find({:slug=>"san-francisco"})
MONGODB dashboard_development['system.namespaces'].find({})
MONGODB dashboard_development['accounts'].find({:_id=>BSON::ObjectId('4e80e0090f6d2e306f000002')})
MONGODB dashboard_development['system.namespaces'].find({})
MONGODB dashboard_development['neighborhoods'].find({"city_id"=>BSON::ObjectId('4e80e00a0f6d2e306f000005')})

Затем просматриваются представления, они тоже довольно медленные ... но это отдельная проблема, я решу это в другой раз.

Rendered cities/_title_and_scope.html.erb (109.3ms)
Rendered application/_dropdown.html.erb (0.1ms)
Rendered application/_date_range_selector.html.erb (6.2ms)
Rendered cities/show.html.erb within layouts/application (122.7ms)
Rendered application/_user_dropdown.html.erb (0.9ms)
Rendered application/_main_navigation.html.erb (5.8ms)

Так что, за исключением просмотров, запрос занимал около 500 мс, что слишком долго для действительно простого запроса, кроме того, приложение будет расти, и это время будет расти. Также этот пример быстрее, чем обычно принимают запросы, иногда это занимает 1000 мс или более!

Completed 200 OK in 628ms (Views: 144.9ms)

Кроме того, я хотел спросить, какие поля наиболее подходят для индексов? Может быть, это моя проблема, так как я их вообще не использую. Любая помощь в понимании этого будет очень цениться. Спасибо!

1 Ответ

2 голосов
/ 15 ноября 2011

Вам нужно использовать индексы - в противном случае ваши монго запросы выполняют то, что лучше всего описать как полное сканирование таблицы. Он загружает в память все документы json вашей коллекции, а затем оценивает каждый из них, чтобы определить, следует ли включать его в ответ.

Строки, Дата, Числа могут быть использованы в качестве индекса - хитрость в том, чтобы иметь индекс для каждого атрибута, для которого вы выполняете «где».

Вы можете отключить сканирование таблиц в своей конфигурации Монго, чтобы помочь найти сканирование таблиц и уничтожить их!

...