1

我尝试使用名为“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]

然后显示一个超过 80 条 sql 的页面大约需要 650 毫秒。
所以我把它改成了这个

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

现在,子弹的警报消失了,但它需要 750 毫秒,仍然有 80 多条 sql。

这是为什么?

4

1 回答 1

0

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

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

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

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

我建议你使用像Miniprofiler这样的工具来分析你的页面。这将帮助您准确了解您的延误在哪里。

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

  1. 添加分页以限制结果集。
  2. 看看你的日志;他们有很多有用的信息。
  3. 你的表有索引吗?如果不添加索引。
  4. 使用 Miniprofiler。
于 2013-07-18T02:01:46.903 回答