mysql - 优化 join/union sql?

标签 mysql select union

我有以下 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/

相关文章:

mysql - 优化mysql中的多 channel 连接

sql-server - 如何查找数据库中使用 UNION 的所有对象

php - 从两个表中选择并从两个表中检查 'Friend lists'

SQL 行插入表 + 键在一条语句内插入其链接表(多对多关系)

mysql - CONCAT_WS 分隔符

多项选择的 JavaScript selectedIndex 文本

SQL Server : case statement

php - 连接mysql中的两个表

php - 内爆在不同的帖子中不起作用

php - 将庞大的数据库导入本地服务器