2015-03-02 41 views
-1

在一個查詢中更新多行,兩者都可以工作。MySQL WHEN與WHERE在性能?

與在

UPDATE category 
    SET description = CASE id 
     WHEN 1 THEN 'good' 
     WHEN 2 THEN 'bad' 
     WHEN 3 THEN 'ugly' 
    END 
WHERE id IN (1,2,3) 

沒有WHERE

UPDATE category 
    SET description = CASE id 
     WHEN 1 THEN 'good' 
     WHEN 2 THEN 'bad' 
     WHEN 3 THEN 'ugly' 
    END 

但有什麼區別? WHEN是否使用索引?表格增長非常大時,哪種表現更可取?

+1

重新配置爲SELECT並使用EXPLAIN來檢查是否使用了索引。 – 2015-03-02 10:35:44

+0

在你的「沒有WHERE」時,id = 4時會發生什麼?是否總是定義「id」,並等於三個值之一? – Rubik 2015-03-02 10:36:03

+0

@DanielSchneller,你能幫我把它改寫成SELECT嗎?我不知道該怎麼做。 – 2015-03-02 10:45:30

回答

4

這是有點長的評論。

你的兩個查詢是完全不同的。第一個只會影響具有id三個值的行。第二個會影響所有行,對於id有任何其他值的行,將描述設置爲NULL。若要等效,第二個查詢應該是:

UPDATE category 
    SET description = (CASE id 
          WHEN 1 THEN 'good' 
          WHEN 2 THEN 'bad' 
          WHEN 3 THEN 'ugly' 
          ELSE description 
         END); 

這兩個查詢仍語義不同,但對數據的影響是一樣的。例如,該版本會在所有行上調用update觸發器,而第一個版本只會在匹配WHERE條件的行上調用它。

如果您關心查詢的性能和可維護性,則應該使用WHERE條件。