这是使用NOT IN的好方法吗?

时间:2016-04-26 12:33:55

标签: php mysql

让我们想象一下Facebook的主页。有一个帖子列表,我报告了一个帖子,该帖子被阻止了。

所以,在PHP& Mysql后端,我会做类似的事情。

  1. reported_posts = MySQL GROUP_CONCAT(reported_post_id)并获取我所有报告的帖子,将其存储在某些缓存中,例如memcached或redis。这将使用逗号分隔的post_id(例如123, 234, 45
  2. )给出回复
  3. 获取homepage_posts的所有NOT IN (reported_posts)。这将为我们提供除了帖子123,234和45之外的所有post_ids所需的内容,因为我使用了NOT IN
  4. 这里的问题是,随着时间的推移,reported_posts将继续增加(假设它增加1000个ID)。那时,NOT IN (reported_posts)子句将需要大量的输入。这会影响查询的性能吗?对此有什么替代解决方案?

    我希望我能清楚地表达我的怀疑,如果需要更多澄清,请告诉我,我会这样编辑。谢谢。

    修改

    报告的帖子不应被视为全球性,即如果我报告该帖子,则应仅为我隐藏,而不是为其他任何人隐藏。所以,它也依赖于account_id。

2 个答案:

答案 0 :(得分:3)

假设reported_posts包含特定于用户的黑名单帖子列表,那么执行独占左连接并让数据库处理所有内容会更好:

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

答案 1 :(得分:0)

在mysql中,“IN”运算符在索引列时工作正常。如果该列未编入索引,则会影响性能。