我有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,它创建临时表。
为什么明确'JOIN'ing不是选择'FROM'多个表快? – Rudie
“FROM”会导致创建一个笛卡尔产品,使您的结果集再次减少(不完全按此顺序)。有明确的'JOIN's,你正在减少结果集。优化器通常足够聪明以捕获一些'JOIN's,但是它做出的决定将基于更大的结果集。 – judda