非常复杂的FQL查询非常慢

时间:2012-08-13 16:27:43

标签: facebook facebook-fql

我正在尝试使用Facebook FQL从用户的新闻Feed获取前50个帖子(朋友的帖子),以及每位朋友的个人资料信息。我有两个查询,总共10秒处理:

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 个答案:

答案 0 :(得分: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)'
 }

当我在Graph API资源管理器中运行它们时,您的两个查询需要4072 + 1304 = 5376ms。多重查询需要3475毫秒。运行两个单独的查询可以消除网络延迟,这可以大大加快您的应用程序。

您可以通过将AND strlen(message) > 0添加到第一个查询的WHERE部分来过滤掉空白消息。

您可以使用ORDER BY column强制按特定顺序返回数据,但无法保证您将获得结果中的所有行。