似乎将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如何跳过此记录?与写作相比是一项繁重的任务吗?
答案 0 :(得分:4)
你为什么不试试:
UPDATE posts SET rates = rates + 'X' WHERE post_id in (44,33...)
对我而言,如果您知道要更新的行的ID,请直接转到它们。
如果X,Y,Z的数量有限,您也可以这样做。
如果更新后的值与更新前相同,那么MySQL会更新一行吗?
答案 1 :(得分:4)
为什么不使用EXPLAIN或profiling等可用工具进行实验,而不是询问效率最高的? 只需在更新中添加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是主键:
CASE ... WHEN ...
) 1.06s JOIN
table,由@newtover链接) 0.002s 这是基于每种方法的10次执行的平均时间。
编辑:当更新100行时:
编辑:从@nnichols添加了method 4,没有ELSE
条款。