system.namespaces集合上的MongoDB冗余查询?

时间:2011-11-15 19:27:09

标签: ruby-on-rails ruby mongodb mongoid

所以我一直在使用MongoDB(使用Mongoid Ruby Gem)一段时间了,随着我的应用程序的增长,我注意到随着我的数据增长,请求的时间越来越长,这就是典型的请求我的应用程序看起来像,但它需要大约500毫秒,只是为了DB的东西。

这里没有什么特别的东西只是控制器的东西:

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 个答案:

答案 0 :(得分:2)

您需要使用索引 - 否则,您的mongo查询正在执行最佳描述为全表扫描。它将整个集合的json文档加载到内存中,然后评估每个文档以确定它是否应该包含在响应中。

字符串,日期,数字都可以用作索引 - 诀窍是,在每个属性上有一个索引,你正在做“在哪里”。

您可以在mongo配置中关闭表扫描,以帮助查找表扫描并销毁它们!