如何优化我的活动Feed循环(Rails)

时间:2011-03-29 01:42:16

标签: mysql ruby-on-rails database optimization

我正在为我的应用程序实现一个活动源,就像facebook新闻源一样。每当用户执行某些操作(创建帖子,对帖子发表评论,创建相册,对照片发表评论)时,就会在“活动”表中创建一行,其中包含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秒钟,因此必须有更好的方法来处理这个问题。

1 个答案:

答案 0 :(得分:1)

你有created_at的索引吗?如果不这样做,那将会减慢你的速度--MySQL将不得不通读活动表中的每一行以确保它获得最新的五行(这适用于使用ORDER BY子句的任何内容)。

还有一些建议,但这些都是次要的。可能会刮掉几毫秒,但没有大约三秒钟的时间:

  1. 选择活动时包括用户。这样您就可以在单个数据库查询中获取您的活动及其用户。如果你愿意的话,:include => :user可以做到这一点,或者有一种Rails 3风格的.include(...)方法。
  2. 我听说序列化有点慢。也许您可以使用多态关联,然后根据a.whatever_type选择要显示的内容?
  3. 希望这有帮助!