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