我有以下 SQL 查询,运行得相当好,但是当返回具有 60,000-70,000 行的类别时,它似乎停滞了。我想要有关如何优化它的任何提示,无论是服务器端还是代码本身,以使它尽可能快地运行。虽然它通常会被缓存,但该语句将在每天有 100,000 次点击的网络上使用,我需要它顺利或至少完成查询执行。
SELECT * FROM
(
(
SELECT DISTINCT
vc.category_id, t.tube_title, v.*, COUNT(vc.video_id) AS total_clicks
FROM video_click vc
JOIN tube t ON vc.tube_id = t.tube_id
JOIN video v ON v.video_id = vc.video_id
WHERE
vc.time >= 1313153417
AND
vc.category_id = 123
GROUP BY vc.video_id
)
UNION
(
SELECT DISTINCT
vd.category_id, t.tube_title, v.*, COUNT(NULL) as total_clicks
FROM
video_data vd
JOIN tube t ON vd.tube_id = t.tube_id
JOIN video v ON v.video_id = vd.video_id
WHERE
vd.category_id = 123
GROUP BY vd.video_id
)
) AS final_video
GROUP BY final_video.video_id
ORDER BY total_clicks DESC
我感谢任何提示或帮助,以允许上述内容在更大的数据库选择上运行。 谢谢!
最佳答案
看来您只是与 video_data
表联合,以确保您获得没有点击的视频计数。通过使用左连接可以更轻松地实现这一点。
SELECT
vd.category_id, t.tube_title, v.*, COUNT(vc.video_id) AS total_clicks
FROM video_data vd
LEFT JOIN video_click vc ON vc.video_id = vd.video_id AND vc.time > 1313153417
JOIN tube t ON vd.tube_id = t.tube_id
JOIN video v ON vd.video_id = v.video_id
WHERE
vd.category_id = 123
GROUP BY v.video_id
ORDER BY COUNT(vc.video_id) desc
这应该比您之前的查询运行得更快,但请确保检查它是否返回您想要的结果。
关于mysql - 优化 join/union sql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7055474/