2011-03-29 3 views
2

페이스 북 뉴스 피드와 마찬가지로 내 애플리케이션 용 활동 피드를 구현하고 있습니다. 사용자가 무언가 (게시물 작성, 게시물에 대한 주석 달기, 사진 앨범 만들기, 사진에 대한 주석 달기) 할 때마다 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

created_at에 대한 인덱스가 있습니까? 그렇지 않다면 느려질 것입니다. MySQL은 액티비티 테이블의 모든 행을 읽어 최신 5가 있는지 확인해야합니다 (이는 ORDER BY 절을 사용하는 모든 것에 해당됩니다).

몇 가지 제안 사항이 있지만 사소한 것입니다. 몇 초 동안 면도해도되지만 3 초 정도면 아무 것도 할 수 없습니다.

  1. 활동을 선택할 때 사용자를 포함시킵니다. 이렇게하면 단일 DB 쿼리로 활동과 사용자를 확보 할 수 있습니다. :include => :user 트릭이나 레일 3 스타일 .include(...)이 필요합니다.
  2. 필자는 직렬화가 다소 느릴 수 있다고 들었습니다. 아마도 다형성 연관을 사용할 수 있고 a.whatever_type을 기반으로 표시 할 항목을 선택할 수 있습니까?

희망이 있습니다.

+0

팁 주셔서 감사합니다. 나는'created_at? '에 대한 색인을 가지고 있지 않지만, 하나를 추가 할 것이다. 저는 실제로 약간의 제거 프로세스를 수행하고 병목 현상이 'small_pic_url'인 사용자가 아바타가 있는지 여부를 확인하는 도우미 메서드로 판단했습니다. – aguynamedloren

관련 문제