2
UPDATE table1  
INNER JOIN table2  
ON table1.var1=table2.var1  
SET table1.var2=table2.var2

我的表中有大约 975,000 行,我知道无论如何这都需要一段时间。有没有更好的方法来写这个?

谢谢!

4

2 回答 2

0

如果标准情况是 table1.Var2 已经等于 table2.var2,那么您最终可能会得到一个夸大的写入计数,因为数据库可能仍会更新所有这些行而没有功能上的值变化。

通过仅更新那些与您想要的值不同的行,您可以获得更好的性能。

UPDATE table1  
INNER JOIN table2  
ON table1.var1=table2.var1  
SET table1.var2=table2.var2
WHERE (table1.var2 is null and table2.var2 is not null OR
       table1.var2 is not null and table2.var2 is null OR
       table1.var2 <> table2.var2)

编辑:没关系... MySQL 只更新实际更改,不像其他一些 RDBMS(例如 MS SQL。)

于 2013-07-17T00:16:14.873 回答
0

您的查询:

UPDATE table1 INNER JOIN
       table2  
       ON table1.var1 = table2.var1  
    SET table1.var2 = table2.var2;

先验,这看起来不错。我可以看到的主要问题是从table1到的一对多关系table2。在这种情况下,来自 的多行table2可能与来自 的给定行匹配table1。在这种情况下,MySQL 会分配一个任意值。

您可以通过选择一个值来解决此问题,例如min()

UPDATE table1 INNER JOIN
       (select var1, min(var2) as var2
        from table2
        group by var1
       ) t2
       ON table1.var1 = t2.var1  
    SET table1.var2 = t2.var2;

出于性能原因,您应该在table2(var1, var2). 通过在索引中包含两列,查询将能够仅使用索引,而不必直接从表中获取行。

于 2013-07-17T00:34:25.080 回答