MySQL:通过leftjoin vs iterating从另一个表更新表

时间:2014-04-02 07:17:12

标签: mysql bash shell

我有两个表T1和T2,并希望从T2更新T1的一个字段,其中T2保存海量数据。 什么更有效? 在值上循环迭代中更新T1 要么 左边用T2连接并更新。

请注意我在shell脚本中更新这些表

2 个答案:

答案 0 :(得分:0)

通常,JOIN总是比循环更好。如果正确编制索引,则大小不应成为问题。

答案 1 :(得分:0)

没有简单的答案会更有效,它将取决于您要一次更新的表格大小和数据大小。

假设您正在使用innodb引擎并尝试一次更新1,000个或更多行,并且有2个重表连接,这是非常频繁的,那么它在生产服务器上不是一个好主意,因为它会锁定您的表一段时间由于此锁定,您的生产服务器上也可能会遇到其他一些操作。

选项1:如果您尝试更新几行并基于正确的索引字段(首选基于主键),那么您可以选择加入。

选项2:如果您尝试基于多个表加入更新大量数据,那么下面的选项会更好:

步骤1:创建存储过程。

步骤2:在游标中保留以下查询结果。

假设您要更新TABLE table1的TABLE table2 IN field1的相应field2 DATA:

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...];

步骤3:现在使用游标中的存储值,逐个主键更新所有行。

步骤4:您可以从脚本中调用此存储过程。