2012-08-13 76 views
0

我想從使用Facebook的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 

我試過其他方式獲得的數據(快),但是,它返回它按隨機順序(Facebook並不能保證數據出來它的方式)。

,我可以把我的網站上一個「加載」動畫,但我不希望因爲我認爲這是可以優化,但我不知道怎麼樣。

在過去,我用的圖形API,但我不得不處理結果自己,這是非常低效的(接管30秒以上)。

回答

1

這兩個查詢,你應該能夠通過將它們組合成一個單一的多查詢加快速度了不少,尤其是你的第二個查詢包括第一個查詢。這是最複雜的,如果你使用不同的API調用發送它們,Facebook必須執行兩次。

{ 
'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)' 
} 

你兩個查詢花費4072 + 1304 = 5376ms,當我在圖形API Explorer中運行它們。多查詢需要3475ms。通過運行兩個單獨的查詢消除網絡延遲,這應該會大大加快您的應用程序。

您可以通過將AND strlen(message) > 0添加到第一個查詢的WHERE部分來篩選出空白郵件。

您可以使用ORDER BY column強制以特定順序返回數據,但不能保證您將得到結果中的所有行。

+0

甜。謝謝您的幫助! – alexy13 2012-08-13 17:16:37

+0

它似乎工作了幾次,然後在這兩個查詢給出了不匹配的結果(一個查詢可能只有21個結果到45),另一個將是相同的。用戶的帖子不與檔案信息匹配:(。我可以通過ID兩個數組排序,但那就不是通過創建日期訂購它是否有一個簡單的方法來解決這一問題? – alexy13 2012-08-16 03:10:52

+1

是的,最簡單的方法是有兩個嵌套的foreach循環。修改Q2查詢,還可以通過Q1財年第一季度通過Q2返回'id',然後循環。那麼對於每一行,循環,直到你發現在Q1相匹配的'actor_id'的'id'。您可以爲每個用戶提供多個帖子,所以他們可能不會匹配。 – cpilko 2012-08-16 03:18:05