2015-03-02 68 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条件。