对于简单更新/插入,我可以始终使用INSERT .... ON DUPLICATE UPDATE吗?
问题描述:
(MYSQL)是否有任何显着的性能差异,或其他原因不使用INSERT ... ON DUPLICATE UPDATE
SQL更新通过PK /插入新的东西?对于简单更新/插入,我可以始终使用INSERT .... ON DUPLICATE UPDATE吗?
答
不,没有。
INSERT ON DUPLICATE KEY UPDATE
将找到记录并更新它,就像一个简单的UPDATE
会做的那样。
事实上,这只是一个UPDATE
,如果UPDATE
失败,后面是INSERT
。
INSERT ON DUPLICATE KEY UPDATE
可以到编组更新更快的替代方案(当你有每个键的多条记录源表,并希望每一次记录递增的目标表)。
如果每个关键几个值,这个查询:
INSERT
INTO t_target
SELECT target, cnt
FROM t_sparse d
ON DUPLICATE KEY UPDATE
t_target.cnt = t_target.cnt + d.cnt
会更有效率比这一个:
INSERT
INTO t_target
SELECT target, cnt
FROM (
SELECT target, SUM(cnt) AS cnt
FROM t_sparse di
GROUP BY
target
) d
ON DUPLICATE KEY UPDATE
t_target.cnt = t_target.cnt + d.cnt
请参阅本文中我的博客更多的细节:
答
我想给出一个更细致的答案。这取决于DBMS的实施。尽管如此,从经验来看,我可以告诉你,大多数DBMS对INSERT ... ON DUPLICATE UPDATE
都有很好的支持。
事实上,它往往可以带来更好的性能,使用自DMBS可以组这些命令,从而减少工作要做INSERT ... ON DUPLICATE UPDATE
。这是与MySQL的情况下,你经常可以看到一些速度10〜20%的增幅比较简单的插入+更新策略,没有任何形式的配料。总的来说,我会推荐INSERT ... ON DUPLICATE UPDATE
,因为它更简单易用,代码更容易维护,并且通常会带来额外的速度优势。
哪些是支持这一条款的人的DBMS(除'MySQL')? – Quassnoi