我尝试使用名为“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。
为什么?
答案 0 :(得分:0)
首先,您的分页代码是错误的。它应该是这样的:
@communities = Community.scoped.order("created_at DESC").paginate(per_page: 10, page: params[:page])
其次,很难说因为你没有提到750毫秒是总执行时间还是只是查询。
一时兴起,我怀疑是因为你正在将大量记录加载到内存中。它可能与您的表有多少记录有关,以及您是否已将它们编入索引。
我建议您使用Miniprofiler之类的工具来分析您的网页。这有助于您准确了解延迟的位置。
你可以做的其他事情,假设它是数据库,而不是其他东西: