【问题标题】:How to optimize my activity feed loop (Rails)如何优化我的活动提要循环(Rails)
【发布时间】:2011-03-29 09:57:39
【问题描述】:

我正在为我的应用程序实现一个活动提要,就像 facebook 新闻提要一样。每当用户执行某项操作(创建帖子、对帖子进行 cmets、创建相册、对照片进行 cmets)时,都会在活动表中创建一行,其中包含 user_id、类别和数据。数据是一个序列化的散列,对于每种类型的活动都是不同的(帖子包含帖子标题和帖子 ID,照片评论包含其他内容等)。然后视图循环遍历所有活动并根据活动类别打印一些内容。很简单,而且很有效。问题是它超级慢,所以我一定做错了什么。代码如下:

#activity.rb snippet

  def post?
   category == "post"
  end

  def post_comment?
   category == "post_comment"
  end

  def album?
   category == "album"
  end

  def photo_comment?
   category == "photo_comment"
  end

#controller snippet

@Activity = Activity.all(:order=> 'created_at DESC', :limit=>"5")

#view snippet

<% @Activity.each do |a| %>
 <div class="activity_item">
  <div class="avatar" style="background-image: url(<%= small_pic_url(a.user)%>) "></div>
  <div class="text"> <%= a.user.username %> 
  <% if a.post? %>
   posted <%= link_to a.data["post_title"], post_path(a.data["post_id"]) %>
  <% elsif a.post_comment? %>
   commented on <%= link_to a.data["post_title"], post_path(a.data["post_id"]) %>
  <% elsif a.album? %>
   created a <%= link_to "Photo Album", album_path(a.data["album_id"])%>
  <% elsif a.photo_comment? %>
   commented on <%= link_to "#{a.data["username"]}'s photo", upload_path(a.data["photo_id"])%>
  <% end %>
  </div>
 </div>
 <% end %>

我在活动表上添加了一个 user_id 索引,但这似乎没有多大作用。渲染 5 个活动项目/头像需要 3 秒以上,因此必须有更好的方法来处理。

【问题讨论】:

    标签: mysql ruby-on-rails database optimization


    【解决方案1】:

    你有created_at 的索引吗?如果你不这样做,那将是让你放慢速度的原因——MySQL 必须通读你的活动表中的每一行以确保它得到最新的五个(这几乎适用于任何使用ORDER BY 子句的东西)。

    还有一些建议,但这些都是次要的。可能会减少几毫秒,但不会在三秒左右:

    1. 选择活动时包括用户。这将让您在单个数据库查询中获取您的活动及其用户。 :include =&gt; :user 应该可以解决问题,或者如果您愿意,可以使用 Rails 3 风格的 .include(...) 方法。
    2. 我听说序列化可能有点慢。也许您可以使用多态关联,然后根据a.whatever_type 选择要显示的内容?

    希望这会有所帮助!

    【讨论】:

    • 感谢您的提示。我在created_at? 上没有索引,但我会添加一个。我其实只是做了一点排除的过程,发现瓶颈是small_pic_url,检查用户是否有头像的辅助方法。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 2020-06-29
    • 2011-06-15
    • 1970-01-01
    • 2022-11-03
    • 2020-03-12
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多