在mysql中的大型表上使用INNER JOIN运行UPDATE的最佳方法是什么?

时间:2012-04-01 12:21:02

标签: mysql

我有一个10M行的大表,我们称之为表A. 我还有另一个具有相同结构的表,并且有2M行。我们称之为表B.

每行包含大约20个字段(文本和数字)。

我想用表B中的相应行的值更新表A中的所有行(由主键连接)。

琐碎的UPDATE运行几个小时:

UPDATE A 
INNER JOIN B 
  ON A.primary_key=B.primary_key 
SET A.field1=B.field1, 
    A.field2=B.field2....;

你能建议一些更聪明的方法,而不是内连接上的单个UPDATE命令吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

听起来,由于结果数据集的大小,您可能会遇到缓冲区问题。您可以尝试以较小的块,一次可能100K行。你可以根据PK做到这一点。找到表A中的max primary_key,然后除以100,000以获得所需的迭代次数。

// PSEUDO CODE
MAX = SELECT MAX(primary_key) FROM table A
NUM_PER_QUERY = 100000
NUM_ITERATIONS = CEIL(MAX/NUM_PER_QUERY)

for (i = 0; i < NUM_ITERATIONS; i++) {
    UPDATE .... WHERE A.primary_key BETWEEN ((i * NUM_PER_QUERY) + 1) AND ((i + 1) * NUM_PER_QUERY)
}