优化sql查询轨道
在帖子索引页面上,我按以下方式列出所有帖子: posts\u controller.rb优化sql查询轨道,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,在帖子索引页面上,我按以下方式列出所有帖子: posts\u controller.rb def index @posts = Post.includes(:comments).paginate(:page => params[:page]).order("created_at DESC") end <%= render @posts %> <%= gravatar_for post.user, size:20 %> <%= link_to "#{p
def index
@posts = Post.includes(:comments).paginate(:page => params[:page]).order("created_at DESC")
end
<%= render @posts %>
<%= gravatar_for post.user, size:20 %>
<%= link_to "#{post.title}", post_path(post) %>
<%= time_ago_in_words(post.created_at) %>
<%= post.comments.count %>
<%= post.category.name if post.category %>
index.html.erb
def index
@posts = Post.includes(:comments).paginate(:page => params[:page]).order("created_at DESC")
end
<%= render @posts %>
<%= gravatar_for post.user, size:20 %>
<%= link_to "#{post.title}", post_path(post) %>
<%= time_ago_in_words(post.created_at) %>
<%= post.comments.count %>
<%= post.category.name if post.category %>
\u post.html.erb
def index
@posts = Post.includes(:comments).paginate(:page => params[:page]).order("created_at DESC")
end
<%= render @posts %>
<%= gravatar_for post.user, size:20 %>
<%= link_to "#{post.title}", post_path(post) %>
<%= time_ago_in_words(post.created_at) %>
<%= post.comments.count %>
<%= post.category.name if post.category %>
每页35篇文章
当我第一次在dev env中加载页面时,
机架迷你探查器显示:这次:1441.1 ms
重新加载几次后:~700 ms
我能否以某种方式减少此时间和sql请求数?
以下是rmp图像(如果有帮助):
您可以通过以下方式减少sql查询的数量:
- 包括
以及用户
,因为您在显示gravatar时似乎正在使用这些注释注释
- 将
更改为post.comments.count
post.comments.size
加载关联(除非它已经加载)并返回数组的长度length
执行count
是否加载关联选择count(*)查询
如果关联已加载,则使用size
;如果未加载,则使用length
count
在您的情况下,注释关联已加载,但由于您使用的是
count
,因此它实际上未被使用您可以通过以下方式减少sql查询的数量:
- 包括
以及用户
,因为您在显示gravatar时似乎正在使用这些注释注释
- 将
更改为post.comments.count
post.comments.size
加载关联(除非它已经加载)并返回数组的长度length
执行count
是否加载关联选择count(*)查询
如果关联已加载,则使用size
;如果未加载,则使用length
count
在您的案例中,已加载注释关联,但由于您使用的是
count
,因此实际上未使用该关联在引用列(您案例中的注释)上添加索引可能会有所帮助
add_index :posts, :comment_id
在引用列(您的案例中的注释)上添加索引可能会有所帮助
add_index :posts, :comment_id
此外,除了打印记录数之外,您实际上似乎没有使用
comments
集合。如果确实如此,请使用(4.1.2.3
)而不是查询注释(注释数量将在父记录Post
中提供)
也可考虑A~代码> TimeNo.AgooIn词。如果您以后决定缓存整个节/页,它也会有所帮助
最后只检索要使用的字段。在这种情况下,我可以想象
Post
包含大量内容文本,并且它没有在任何地方使用(但仍然需要从数据库传输)。此外,除了打印记录数,您实际上似乎没有使用comments
集合。如果确实如此,请使用(4.1.2.3
)而不是查询注释(注释数量将在父记录Post
中提供)
也可考虑A~代码> TimeNo.AgooIn词。如果您以后决定缓存整个节/页,它也会有所帮助
最后只检索要使用的字段。在这种情况下,我可以想象Post
包含大量的内容文本,它没有在任何地方使用(但仍需要从数据库传输)。650毫秒:)我现在能做的就是这些吗?我还计划在将来使用缓存。650毫秒:)这就是我现在能做的全部吗?我还计划将来使用缓存。