3

我有 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,它会创建临时表。

4

2 回答 2

1

除了删除交叉连接之外,我还会在 SELECT 子句中明确定义您需要的列,即使您需要所有列。

这个数据库在什么平台上?视频表上还有哪些其他索引?

于 2012-06-08T03:37:31.477 回答
1

从查询中删除CROSS JOINs。那些膨胀你的数据集。

SELECT vid. *
FROM video AS vid
JOIN video_liked  AS v1 ON vid.video_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 video_liked.video_id
LIMIT 12
于 2012-06-08T03:27:39.777 回答