CASE几乎对mysql中的多个UPDATE有用吗?

时间:2012-03-10 07:25:58

标签: mysql sql switch-statement sql-update

似乎将UPDATE用于多行的唯一方法是CASE

UPDATE posts SET rates = CASE
WHEN post_id = '44' THEN rates + 'X'
WHEN post_id = '33' THEN rates + 'Y'
WHEN post_id = '73' THEN rates + 'Z'
WHEN post_id = '63' THEN rates + 'X'
...
ELSE rates END

考虑一个包含100万行的表。这需要循环超过100万条记录以更新,例如10行。

如果我们为每个UPDATE使用单个UPDATE作为

UPDATE posts SET rates = rates + 'X' WHERE post_id='44'
UPDATE posts SET rates = rates + 'Y' WHERE post_id='33'
UPDATE posts SET rates = rates + 'Z' WHERE post_id='73'
UPDATE posts SET rates = rates + 'X' WHERE post_id='63'
...

我们将有10个查询,但我们不会遍历999,990个其他行。

UPDATE行的数量明显小于表中的总行数时,哪种方法最有效?

还有一个问题:ELSE rates END中有CASE时; mysql如何跳过此记录?与写作相比是一项繁重的任务吗?

3 个答案:

答案 0 :(得分:4)

你为什么不试试:

UPDATE posts SET rates = rates + 'X' WHERE post_id in (44,33...)

对我而言,如果您知道要更新的行的ID,请直接转到它们。

如果X,Y,Z的数量有限,您也可以这样做。

如果更新后的值与更新前相同,那么MySQL会更新一行吗?

答案 1 :(得分:4)

为什么不使用EXPLAINprofiling等可用工具进行实验,而不是询问效率最高的? 只需在更新中添加where子句 -

UPDATE posts SET rates = CASE post_id
    WHEN 44 THEN rates + 'X'
    WHEN 33 THEN rates + 'Y'
    WHEN 73 THEN rates + 'Z'
    WHEN 63 THEN rates + 'X'
    ...
    END
WHERE post_id IN(44, 33, 73, 63...)

答案 2 :(得分:3)

这确实是一个有趣的问题。 我做了一些测试,在1 000 000行表中更新了10行。 假设post_id是主键:

  • 方法1(CASE ... WHEN ... 1.06s
  • 方法2(10个查询) 0.011s
  • 方法3(JOIN table,由@newtover链接) 0.002s
  • 方法4采用 0.002s

这是基于每种方法的10次执行的平均时间。

编辑:当更新100行时:

  • 方法1: 3.232s
  • 方法2: 0.333s
  • 方法3: 0.032s
  • 方法4: 0.017s

编辑:从@nnichols添加了method 4,没有ELSE条款。