2011-10-21 167 views
1

該查詢從friendlist表中返回用戶朋友的記錄,然後從用戶表中獲取每個用戶的記錄。查詢優化CASE vs UNION

選項#1

SELECT 
    f.status, 
    f.user_to_id, 
    f.user_from_id, 
    u.user_id, 
    u.registration_date, 
    u.nickname, 
    u.email 
FROM ti_friend_list AS f 
    LEFT JOIN ti_user u 
     ON u.user_id = (CASE f.user_from_id 
         WHEN 7 THEN f.user_to_id 
         ELSE f.user_from_id END) 
WHERE (f.user_from_id = 7 
     OR f.user_to_id = 7) 

選項#2

SELECT 
    f.status, 
    f.user_to_id, 
    f.user_from_id, 
    u.user_id, 
    u.registration_date, 
    u.nickname, 
    u.email 
FROM ti_friend_list AS f 
    LEFT JOIN ti_user u 
    ON u.user_id = f.user_to_id 
WHERE f.user_from_id = 7 
UNION ALL 
SELECT 
    f.status, 
    f.user_to_id, 
    f.user_from_id, 
    u.user_id, 
    u.registration_date, 
    u.nickname, 
    u.email 
FROM ti_friend_list AS f 
    LEFT JOIN ti_user u 
    ON u.user_id = f.user_from_id 
WHERE f.user_to_id = 7 

哪一個更最優解。基本上CASE和UNION之間的比較

+2

你比較過嗎?你發現了什麼? – Marco

回答

0

運行它們兩個,看看是否有時差!除此之外,我建議使用CASE方法在未來的意圖和易用性方面更加明確,除非您找到明確的證據表明它沒有執行,否則我會使用該方法。雖然我認爲這將會更快。

+0

在sqlyog分析器中顯示的情況更快。增加記錄會是一樣的嗎? –

+0

酷;您是否使用過SQL「解釋」功能來查看您是否正在索引或執行表掃描?我的觀點是,是的,改進將與增加表大小成比例,因爲需要檢查表值的1個查詢將快於需要檢查表值的2個連續查詢。 – Brian

0

我認爲像布萊恩:

  • 我認爲這是比較困難的,爲發動機優化UNION,因爲你可以unifiate非常不同的事情!
  • 與UNION的問題是,你必須重複查詢的SELECT部分​​和不犯錯誤
  • 發動機將進行聯合的第一部分,那麼第二個部分,然後結合起來。我認爲一些步驟將會完成兩次。

您可以在查詢中嘗試「explain」命令以查看引擎正在使用的計劃。

+0

好,但使用案例對通過索引完成的優化有嚴重影響。我主要關心的仍然是優化,因爲我期望在好友列表中有很多記錄。 –