我有 2 张桌子,其中一张存放物品,另一张存放喜欢的物品。
存储喜欢的表称为 video_liked,有 2 列,video_id 和 user_id,有 2 个索引 - video_id-user_id (UNIQUE) 和 user_id-video_id (PRIMARY)。
另一个表称为视频,具有主索引和自动递增列 ID。
我正在尝试获取喜欢观众正在观看的用户的相同用户喜欢的项目列表,按喜欢它们的人数排序,至少有 2 个喜欢。
我正在使用的查询是
SELECT vid . * , count( video_liked1.user_id ) AS PersonCount
FROM video AS vid, video_liked, video_liked AS video_liked1
WHERE video_liked.user_id = video_liked1.user_id
AND video_liked.video_id <> video_liked1.video_id
AND video_liked1.video_id = 'ITEM_ID'
AND vid.id = video_liked.video_id
GROUP BY video_liked.video_id
HAVING count( video_liked1.user_id ) >2
ORDER BY PersonCount DESC
LIMIT 12
点赞多的时候查询比较慢,所以我把它简化为最基本的结构
SELECT vid. *
FROM video AS vid, video_liked, video_liked AS video_liked1
WHERE video_liked.user_id = video_liked1.user_id
AND video_liked.video_id <> video_liked1.video_id
AND video_liked1.video_id = 'ITEM_ID'
AND vid.id = video_liked.video_id
GROUP BY video_liked.video_id
LIMIT 12
它有点快,但在 28k 行的 likes 表上执行仍需要 0.05 秒
EXPLAIN 给我的输出太宽而无法在没有自动换行的情况下放在这里,所以这里有一个指向 pastebin 的链接
http://pastebin.com/raw.php?i=6edwdniQ
这也是我在 pastebin 中的表
http://pastebin.com/raw.php?i=jwK1QucA
编辑:
按照建议更改了查询
SELECT vid . *, count( v1.user_id ) AS PersonCount
FROM video AS vid
JOIN video_liked AS v1 ON vid.id = v1.video_id
JOIN video_liked AS v2 ON v2.video_id = 'ITEM_ID'
AND v1.user_id = v2.user_id
AND v1.video_id <> v2.video_id
GROUP BY v1.video_id
ORDER BY PersonCount DESC
LIMIT 12
缓慢的罪魁祸首似乎是使用 GROUP BY,它会创建临时表。