0

Facebook FQLを使用して、ユーザーのニュースフィードから最初の50件の投稿(友達による投稿)と、各友達のプロフィール情報を取得しようとしています。2つのクエリがあり、合計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演算子が見つかりませんでした)

2番目のクエリ:

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秒以上かかる)。

4

1 に答える 1

1

これら 2 つのクエリの場合、特に 2 番目のクエリに最初のクエリが含まれているため、それらを 1 つのマルチクエリに結合することで、かなり高速化できるはずです。これは最も複雑で、別々の API 呼び出しで送信する場合、Facebook はそれを 2 回実行する必要があります。

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

2 つのクエリを Graph API エクスプローラーで実行すると、4072 + 1304 = 5376 ミリ秒かかります。マルチクエリには 3475 ミリ秒かかります。2 つの個別のクエリを実行することによるネットワーク レイテンシが解消されるため、アプリが大幅に高速化されます。

最初のクエリAND strlen(message) > 0の一部に追加することで、空白のメッセージを除外できます。WHERE

を使用ORDER BY columnして、特定の順序でデータを強制的に返すことができますが、結果にすべての行が含まれるという保証はありません。

于 2012-08-13T17:14:12.760 に答える