2012-06-07 53 views
3

我有2个表,其中一个存储物品,另一个存储物品喜欢。是否有可能使此推荐SQL查询更快?

存储喜欢的表称为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 

它的有点快,但仍然需要0.05秒与28K行

一个喜欢表执行

EXPLAIN给我输出太宽,以适应这里没有自动换行,所以这里是一个链接,而不是引擎收录

http://pastebin.com/raw.php?i=6edwdniQ

这里是我的表也是引擎收录

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 

缓慢的罪魁祸首似乎正在使用GRO UP BY,它创建临时表。

回答

2

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

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 
+0

为什么明确'JOIN'ing不是选择'FROM'多个表快? – Rudie

+0

“FROM”会导致创建一个笛卡尔产品,使您的结果集再次减少(不完全按此顺序)。有明确的'JOIN's,你正在减少结果集。优化器通常足够聪明以捕获一些'JOIN's,但是它做出的决定将基于更大的结果集。 – judda

1

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

什么平台是该DB上?你有什么其他的索引在视频表上?

+0

它的MyISAM,我有一堆视频表上的其他索引和列与这个查询无关。 – Shoshomiga