UPDATE table1
INNER JOIN table2
ON table1.var1=table2.var1
SET table1.var2=table2.var2
我的表中有大約975,000行,我知道這將需要一段時間,不管是什麼。有沒有更好的方法來寫這個?這個查詢是否寫得很好?我在這個相當新的,我想知道是否有更好的方式來寫它
謝謝!
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)
的索引。通過在索引中包含兩列,查詢將只能使用索引,而不必直接從表中獲取行。
看起來不錯。 – eggyal
確保您在兩個表中都有var1的索引以提高性能。另外考慮使用像common_schema這樣的工具將更新分成塊:http://common-schema.googlecode.com/svn/trunk/common_schema/doc/html/query_script_split.html –
@ike你只需要一個表2的索引 – Bohemian