让我们想象一下Facebook的主页。有一个帖子列表,我报告了一个帖子,该帖子被阻止了。
所以,在PHP& Mysql后端,我会做类似的事情。
reported_posts
= MySQL GROUP_CONCAT(reported_post_id)
并获取我所有报告的帖子,将其存储在某些缓存中,例如memcached或redis。这将使用逗号分隔的post_id(例如123, 234, 45
homepage_posts
的所有NOT IN (reported_posts)
。这将为我们提供除了帖子123,234和45之外的所有post_ids
所需的内容,因为我使用了NOT IN
。这里的问题是,随着时间的推移,reported_posts
将继续增加(假设它增加1000个ID)。那时,NOT IN (reported_posts)
子句将需要大量的输入。这会影响查询的性能吗?对此有什么替代解决方案?
我希望我能清楚地表达我的怀疑,如果需要更多澄清,请告诉我,我会这样编辑。谢谢。
修改
报告的帖子不应被视为全球性,即如果我报告该帖子,则应仅为我隐藏,而不是为其他任何人隐藏。所以,它也依赖于account_id。
答案 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”运算符在索引列时工作正常。如果该列未编入索引,则会影响性能。