2011-08-14 94 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