2011-08-14 91 views
0

我有以下SQL查询运行相当好,但它似乎停滞时,返回60,000-70,000行的类别。我希望得到关于如何优化这个的技巧,无论是服务器端还是代码本身,都可以尽可能快地运行。虽然它通常会被缓存,但是这个语句将在每天有100,000次命中的网络上使用,并且我需要它平滑或至少完成查询执行。优化join/union sql?

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 

我欣赏任何提示或帮助,让上述运行在较大的数据库选择。 谢谢!

+0

一个提示:我认为DISTINCT是一个昂贵的限定符,因为在GROUP BY数据集返回后它是一个单独的操作。您可能会更好地设计您的表,以便GROUP BY只有一个返回值(如果您能够)。 – Pete855217

+0

发布EXPLAIN的输出总是值得的。 –

回答

1

看起来您只与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 

这应该比您以前的查询运行得更快,但请确保您检查它是否返回所需的结果。

+0

我试过这个SQL,它似乎只返回点击视频。 – Chris

+0

我修改了连接,因为它们使用vc.video_id而不是vd.video_id。让我知道那是怎么回事。 –

+0

非常感谢您的支持,虽然速度并不快,但总共超过500秒以上: 显示第0 - 29行(总共77,767个,查询花费了5.4922秒) – Chris