2016-04-26 7 views
3

私たちはFacebookのホームページを想像してみましょう。投稿のリストがあり、投稿を報告し、その投稿はブロックされています。これはNOT INを使う良い方法ですか?

PHP & Mysqlのバックエンドでは、私は何かのようにします。

  1. reported_posts = MySQLのGROUP_CONCAT(reported_post_id)とmemcachedのか、Redisのようないくつかのキャッシュに保存し、すべての私の報告の記事を取得します。これは、123, 234, 45
  2. homepage_postsのようなカンマ区切りのカンマで区切って返信します。NOT IN (reported_posts)です。これにより、NOT INを使用したので、post_idsの投稿は123、234、45以外のホームページに掲載する必要があります。

ここで問題となるのは、時間がたつにつれて、reported_postsは増加し続ける(1000 idsを増やすと仮定します)。その時点では、NOT IN (reported_posts)句は大きな入力を取ります。これはクエリのパフォーマンスに影響しますか?これに対する代替ソリューションは何ですか?

私は疑いを明確に伝えることができたと思いますが、もっと明確にする必要がある場合は教えてください。ありがとうございました。

EDIT

は報告のポストは、私はポストを報告し、即ち場合、それは私だけのためではなく、他の誰のために非表示にする、世界的に考えるべきではないです。したがって、account_idにも依存しています。

+0

は、あなたは、単に報告された投稿を取得しないようにWHERE条件を追加することができます。 'WHERE reported_coulmn <> 0'のように。あなたが報告された投稿とそのブール値のための列を取ったことを考えてみましょう。 –

+0

このようなピボットテーブルを使用する理由はありません。これを行うことができますが、パフォーマンスを取るつもりだ – Machavity

答えて

3

reported_postsは、ユーザー固有のブラックリストに載った記事のリストが含まれ、に参加し、データベースがすべてを処理させる排他的な左を行うには非常に良いだろうと仮定します。mysqlで

SELECT * 
FROM homepage_posts hp 
LEFT JOIN 
    reported_posts rp 
    ON hp.id = rp.post_id  
     AND rp.account_id = 123 
WHERE 
    rp.id IS NULL 
+0

我々が取得する場所からテーブルヒット 'reported_posts'は、ユーザー固有のブラックリストに載った記事のリストが含まれていますが、それは列' account_id'があり、すなわち ' –

+0

こんにちは、まだpost_id' 。私はそれが完了したらそれを受け入れるでしょう。これはうまくいくはずです。ありがとう –

0

「IN」演算子列が索引付けされている場合は正常に動作します。その列が索引付けされていない場合は、パフォーマンスに影響します。

関連する問題