为什么包含无助于加速?

时间:2013-07-18 01:49:27

标签: ruby-on-rails ruby-on-rails-3

我尝试使用名为“bullet”的gem来避免N + 1问题。

我之前的代码是

@communities = Community.scoped.page(params[:page]).order("created_at DESC")

然后我收到了这个错误

N+1 Query detected
  Community => [:platform]
  Add to your finder: :include => [:platform]

N+1 Query detected
  Community => [:genre]
  Add to your finder: :include => [:genre]

N+1 Query detected
  Community => [:tags]
  Add to your finder: :include => [:tags]

然后花了大约650ms来显示一个超过80个sql的页面 所以我把它改成了这个

@communities = Community.scoped.page(params[:page]).order("created_at DESC").includes(:platform, :genre, :tags)

现在,子弹的警报已经消失,但它需要750毫秒,而且还有超过80个sql。

为什么?

1 个答案:

答案 0 :(得分:0)

首先,您的分页代码是错误的。它应该是这样的:

@communities = Community.scoped.order("created_at DESC").paginate(per_page: 10, page: params[:page])

其次,很难说因为你没有提到750毫秒是总执行时间还是只是查询。

一时兴起,我怀疑是因为你正在将大量记录加载到内存中。它可能与您的表有多少记录有关,以及您是否已将它们编入索引。

我建议您使用Miniprofiler之类的工具来分析您的网页。这有助于您准确了解延迟的位置。

你可以做的其他事情,假设它是数据库,而不是其他东西:

  1. 添加分页以限制结果集。
  2. 看看你的日志;他们有很多有用的信息。
  3. 您的表是否已编入索引?如果没有添加索引。
  4. 使用Miniprofiler。