UPDATE table1
INNER JOIN table2
ON table1.var1=table2.var1
SET table1.var2=table2.var2
我的表中有大约 975,000 行,我知道无论如何这都需要一段时间。有没有更好的方法来写这个?
谢谢!
如果标准情况是 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。)
您的查询:
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)
. 通过在索引中包含两列,查询将能够仅使用索引,而不必直接从表中获取行。