2012-08-13 5 views
0

페이스 북의 FQL과 각 친구의 프로필 정보를 사용하여 사용자의 뉴스 피드에서 처음 50 개의 게시물 (친구 별 게시물)을 얻으려고합니다. 내가 처리 10 초 총 두 개의 쿼리,이 :이 쿼리는 메시지가 "경우에도 사용자를 반환매우 복잡한 FQL 쿼리 매우 느림

SELECT actor_id, message FROM stream 
    WHERE filter_key IN 
    (SELECT filter_key FROM stream_filter WHERE uid= me() AND type='newsfeed') 
    AND actor_id in (SELECT uid2 FROM friend WHERE uid1 = me()) 
    LIMIT 50 

을로" "(내가 가진 행을 필터링하기 위해 NOT 연산자를 찾을 수 없습니다" 메시지)

두 번째 쿼리 :

SELECT pic_big, name,url from profile WHERE id IN 
    (SELECT actor_id, message FROM stream WHERE filter_key IN 
    (SELECT filter_key FROM stream_filter WHERE uid= me() 
    AND type='newsfeed') 
    AND actor_id in (SELECT uid2 FROM friend WHERE uid1 = me())) 
    LIMIT 50 

나는 데이터를 (더 빨리)를하지만, 페이스 북은 데이터가 나오는 것은 아닙니다 (무작위 순서로 돌려받을 수있는 다른 방법을 시도했습니다 그것이 들어간 길).

내 웹 사이트에 '로딩'애니메이션을 넣을 수는 있지만 최적화 할 수 있다고 생각하기 때문에 좋아하지는 않을 것입니다.하지만 어떻게해야할지 모르겠습니다.

과거에는 그래프 API를 사용했지만 결과를 직접 처리해야했으며 30 초 이상 걸리는 매우 비효율적이었습니다.

답변

1

두 가지 쿼리의 경우 특히 두 번째 쿼리에 첫 번째 쿼리가 포함되어 있기 때문에 두 개의 쿼리를 단일 다중 쿼리로 결합하여 작업 속도를 상당히 높일 수 있습니다. 이 API는 가장 복잡하며 별도의 API 호출로 보낼 경우 Facebook은이 API를 두 번 수행해야합니다.

{ 
'q1':"SELECT actor_id, message FROM stream 
     WHERE filter_key IN 
     (SELECT filter_key FROM stream_filter WHERE uid= me() AND type='newsfeed') 
      AND actor_id IN (SELECT uid2 FROM friend WHERE uid1 = me()) 
     LIMIT 50", 
    'q2':'SELECT pic_big, name, url, id FROM profile WHERE id IN 
     (SELECT actor_id FROM #q1)' 
} 

그래프 API 탐색기에서 실행하면 두 개의 쿼리에 4072 + 1304 = 5376ms가 걸립니다. 멀티 쿼리는 3475ms가 소요됩니다. 네트워크 대기 시간이 두 개의 별도 쿼리를 실행하지 않아도되므로 앱 속도가 크게 향상됩니다.

첫 번째 쿼리의 WHERE 부분에 AND strlen(message) > 0을 추가하여 빈 메시지를 필터링 할 수 있습니다.

ORDER BY column을 사용하여 특정 순서로 데이터를 강제로 반환 할 수 있지만 결과에 모든 행이 들어갈 것이라는 보장은 없습니다.

+0

달콤한. 도와 주셔서 감사합니다! – alexy13

+0

몇 차례 작동 한 것처럼 보인 후 두 쿼리가 일치하지 않는 결과를 보였습니다 (하나의 쿼리는 21 개 결과가 45 개 였을 것이고 다른 하나는 동일 할 것입니다). 사용자의 게시물이 프로필 정보와 일치하지 않습니다 :(. 두 배열을 ID별로 정렬 할 수 있지만 만든 날짜별로 정렬하지 않습니다.이 문제를 해결하는 쉬운 방법이 있습니까? – alexy13

+1

예. 가장 쉬운 방법은 다음과 같습니다. 두 개의 중첩 된 FOREACH 루프와 함께 q2 쿼리를 수정하여 id를 반환하고 Q1 결과를 반복 한 다음 q1의 각 행에 대해 q2의 루프를 반복하여 q1의 actor_id와 일치하는 id를 찾습니다. 각 사용자의 게시물이 두 개 이상있을 수 있으므로 일치하지 않을 수도 있습니다. – cpilko