我可以使用始终INSERT .... ON DUPLICATE UPDATE进行简单的更新/插入吗?

时间:2009-12-11 14:25:55

标签: sql mysql

(MYSQL)是否有任何显着的性能差异或其他原因不使用INSERT ... ON DUPLICATE UPDATE sql通过PK /插入新内容来更新?

2 个答案:

答案 0 :(得分:3)

不,没有。

INSERT ON DUPLICATE KEY UPDATE将找到记录并更新它,就像一个简单的UPDATE一样。

实际上这只是UPDATE,如果INSERT失败,则会UPDATE

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

有关详细信息,请参阅我的博客中的这篇文章:

答案 1 :(得分:0)

我想给出一个更细致的答案。这取决于DBMS的实现。不过,根据经验,我可以告诉你,大多数DBMS对INSERT ... ON DUPLICATE UPDATE都有很好的支持。

实际上,使用INSERT ... ON DUPLICATE UPDATE通常可以带来更好的性能,因为DMBS可以对这些命令进行分组,从而减少了工作量。这是mysql的情况,与简单的插入+更新策略相比,你可以经常看到速度提高了10%到20%,没有任何类型的批处理。总的来说,我会推荐INSERT ... ON DUPLICATE UPDATE,因为它使用起来更简单,代码更易于维护,并且通常会带来额外的速度优势。