MySQL:通过leftjoin与迭代从另一个表更新表

MySQL:通过leftjoin与迭代从另一个表更新表,mysql,bash,shell,Mysql,Bash,Shell,我有两个表T1和T2,我想从T2中更新一个T1字段,其中T2包含大量数据。 什么更有效率? 在值上的for循环迭代中更新T1 或 左键将其与T2连接并更新 请注意,我正在用shell脚本更新这些表。一般来说,连接总是比循环好得多。如果索引正确,则大小不应成为问题 没有更有效的简单答案,它将取决于表大小和数据大小,您将一次性更新到表大小和数据大小 假设您正在使用innodb引擎,并尝试使用两个重表联接一次性更新1000行或更多行,并且这种情况非常频繁,那么在生产服务器上这将不是一个好主意,因为它将

我有两个表T1和T2,我想从T2中更新一个T1字段,其中T2包含大量数据。 什么更有效率? 在值上的for循环迭代中更新T1 或 左键将其与T2连接并更新


请注意,我正在用shell脚本更新这些表。一般来说,连接总是比循环好得多。如果索引正确,则大小不应成为问题

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

假设您正在使用innodb引擎,并尝试使用两个重表联接一次性更新1000行或更多行,并且这种情况非常频繁,那么在生产服务器上这将不是一个好主意,因为它将锁定您的表一段时间,并且由于这种锁定,生产服务器上还可能会遇到一些其他操作

选项1:如果您试图更新几行并基于适当的索引字段(首选基于主键),则可以使用join

选项2:如果您试图基于多个表联接更新大量数据,则下面的选项会更好:

步骤1:创建一个存储过程

步骤2:将下面的查询结果保留在光标中

假设您要在表1的字段1中更新表2的相应字段2数据:

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:您可以从脚本中调用此存储过程。

可能重复的存储过程可能是,您需要迭代T2中的6m行,并检查T1(以及可能的更新),或者需要读取T1并对照T2检查每行,以确定是否需要更新。这将是非常缓慢的。第二种方法的工作与连接的工作大致相同,但需要对SQL进行大量额外的解析。两者都可能比在连接上执行更新慢得多,但其优点是每次更新完成后,它们只会在很短的时间内锁定表。表T2不是索引的,这会产生很大的差异。如果存在大量数据,则未编制索引的列上的联接将具有非常差的性能。尽管如此,基于集合的解决方案几乎总是更具性能。如果可能的话,您应该添加索引。然后在联接之前使用“ALTER TABLE T2 add index(COLUMN_NAME);”将提高性能。在表非常大的列中添加索引是否需要很长时间?是的,您的index语句看起来是正确的。定义“非常大”。它将取决于服务器的规格和数据的大小。更改表
T2
添加索引
idx\u columnname
COLUMN\u NAME
ASC);