2014-04-02 59 views
0

我有兩個表T1和T2,並希望從T2中更新T1的一個字段,其中T2保存海量數據。 什麼更有效率? 通過值 或 在for循環迭代中更新T1左與T2連接並更新。MySQL:通過leftjoin更新另一個表中的表vs

請注意,我在一個shell腳本

+0

可能重複的[MySQL:更新表中的行通過迭代和與另一個連接](http://stackoverflow.com/questions/5532050/mysql-update-rows-in-table-by-iterating-and-加入另一個) – jmail

+0

看來你需要遍歷T2中的6m行,並對T1進行檢查(可能更新),或者你需要在T1上進行讀取並檢查每行對T2,看它是否需要更新。這將是非常緩慢。第二個與JOIN做的工作很相似,但是有很多額外的SQL解析。兩者都可能比在JOIN上進行更新要慢很多,但優點是,每次更新完成後,他們只會在很短的時間內鎖定表。 – Kickstart

回答

0

一般更新這些表,JOIN總會的工作比一個循環更好。大小不應該是一個問題,如果它正確索引。

+0

表T2沒有編入索引 – ivcode

+0

這樣做會有所不同。如果有大量數據,那麼未加索引的列上的聯接將會具有非常差的性能。儘管如此,基於集合的解決方案几乎總是更高效。如果可能的話,你應該添加一個索引。 – smoore4

+0

然後使用「ALTER TABLE T2 ADD INDEX(COLUMN_NAME);」在加入之前會改善業績。 – ivcode

0

沒有簡單的答案會更有效,它將取決於您要一次更新的表大小和數據大小。

假設你正在使用innodb引擎,並試圖用2個繁重的表連接一次性更新1000行或更多行,並且它非常頻繁,那麼在生產服務器上它不會是好主意,因爲它會鎖定你的表一段時間並且由於此鎖定,您的生產服務器上還可能會有其他一些操作。選項1:如果您嘗試更新少量行並基於適當的索引字段(首選基於主鍵),則可以使用連接。

選項2:如果你想更新大量基於多個表的數據連接,然後在下面的選項會更好:

第一步:創建一個存儲過程。

第2步:將查詢結果保留在遊標下方。

假設你想更新對應表表2的場2 DATA IN表table1的字段1:

SELECT a.primary_key,b.field2 FROM table1 a JOIN table2 b ON a.primary_key=b.foreign_key WHERE [place CONDITION here IF any...]; 

第三步:現在更新的所有行逐個基於遊標使用存儲的值主鍵。

第4步:您可以從腳本調用此存儲過程。