2013-07-17 53 views
2
UPDATE table1 
INNER JOIN table2 
ON table1.var1=table2.var1 
SET table1.var2=table2.var2 

我的表中有大約975,000行,我知道這將需要一段時間,不管是什麼。有沒有更好的方法來寫這個?這個查詢是否寫得很好?我在這個相當新的,我想知道是否有更好的方式來寫它

謝謝!

+2

看起來不錯。 – eggyal

+1

確保您在兩個表中都有var1的索引以提高性能。另外考慮使用像common_schema這樣的工具將更新分成塊:http://common-schema.googlecode.com/svn/trunk/common_schema/doc/html/query_script_split.html –

+1

@ike你只需要一個表2的索引 – Bohemian

回答

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的

0

您的查詢(MS SQL,例如。):

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

先驗,這看起來很好。我能看到的主要問題是從table1table2的一對多關係。在這種情況下,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)的索引。通過在索引中包含兩列,查詢將只能使用索引,而不必直接從表中獲取行。

相關問題