代码之家  ›  专栏  ›  技术社区  ›  alexyorke

非常复杂的FQL查询非常慢

  •  0
  • alexyorke  · 技术社区  · 12 年前

    我正在尝试使用facebookFQL从用户的新闻推送中获取前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
    

    我已经尝试了其他方法来获取数据(更快),然而,它以随机顺序返回数据(脸书不能保证数据按照输入的方式显示)。

    我可以在我的网站上放置一个“加载”动画,但我宁愿不这样做,因为我认为这可以优化,但我不确定如何优化。

    过去,我使用图形api,但我必须自己处理结果,而且效率非常低(需要超过30秒)。

    1 回复  |  直到 12 年前
        1
  •  1
  •   cpilko    12 年前

    对于这两个查询,您应该能够通过将它们组合成一个多查询来加快速度,特别是因为您的第二个查询包括第一个查询。这是最复杂的一个,如果你在单独的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。多重查询耗时3475ms。由于运行两个单独的查询消除了网络延迟,这应该会大大加快应用程序的速度。

    您可以通过添加筛选出空白邮件 AND strlen(message) > 0 WHERE 第一个查询的一部分。

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