Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化sql查询轨道_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

优化sql查询轨道

优化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

在帖子索引页面上,我按以下方式列出所有帖子:

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 "#{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毫秒:)这就是我现在能做的全部吗?我还计划将来使用缓存。