【发布时间】:2014-02-01 11:37:24
【问题描述】:
假设我们有以下场景,2 个实体;用户,图片。
用户可以喜欢图像,也可以互相关注。 (所以我们有 2 个关系表,user_likes 和 follow where 谁喜欢什么,谁关注谁被保留)
因此,我们(由用户代表并且)想要执行搜索以获取我们的朋友喜欢并命名为“cat.jpg”的图像。
在 sql 中类似的东西看起来像
SElECT DISTINCT(images.id)
FROM images
JOIN likes ON likes.image_id = images.id
JOIN
(SELECT follow.following_id
FROM follow
WHERE follow.follower_id = MY_ID) as following
ON following.following_id = likes.user_id
WHERE images.name = "cat.jpg"
ORDER BY images.date DESC
LIMIT 0, 20
上述查询将返回我们关注的用户喜欢的图片的 20 个最新唯一 ID,这些图片名为“cat.jpg”。
我的问题是......如何优化这个过程?
我想到的第一个想法是缓存,但如果另一个用户搜索“cat.jpg”,他/她将获得不同的结果(因为他/她将关注不同的用户集)。 因此,在这种特定情况下进行缓存似乎成本很高,因为可能存在大量可能的搜索关键字和大量用户关注用户组合。这是一个可行的解决方案吗?如果该用户不再搜索“cat.jpg”,那么缓存响应只会浪费内存。
通常,我看到有人建议使用 Redis 甚至 Memcached 来存储每个用户的更新列表或社交提要条目,但在搜索场景中,这样的事情似乎不够用。不?
非常感谢任何建议、提示或与讨论类似问题和方法的资源的链接!
【问题讨论】:
标签: mysql sql database performance caching