在Mysql中加入并更新大表

时间:2014-12-14 11:58:54

标签: mysql

表一有:

id, new_id, col1, col2

表二有:

id, col1, col2

表一是超过一百万行,表二是大约250K。

我想在单个查询中执行的操作是:

SET   t1.new_id = t2.id 
WHERE t1.col1   = t2.col1
AND   t1.col2   = t2.col2
AND   t1.new_id IS NULL

我现在拥有的是:

UPDATE t1
LEFT JOIN t2
ON  t1.new_id IS NULL
AND t1.col1 = t2.col1
AND t1.col2 = t2.col2
SET t1.new_id = t2.id

我认为这不对。它太慢了,它永远不会完成......提前感谢!

1 个答案:

答案 0 :(得分:1)

您的查询语法很好。除此之外,t1上的过滤器应该包含在where子句中:

UPDATE t1 LEFT JOIN
       t2
       ON  t1.col1 = t2.col1 AND t1.col2 = t2.col2
SET t1.new_id = t2.id
WHERE t1.new_id IS NULL

或者,使用inner join

UPDATE t1 JOIN
       t2
       ON t1.new_id IS NULL AND  t1.col1 = t2.col1 AND t1.col2 = t2.col2
SET t1.new_id = t2.id;

LEFT JOIN保留第一个表中的所有行,而不管ON子句。这意味着您的公式正在更新t1中的所有行,这可能会导致性能问题。对第一个表上的过滤器使用where子句或使用inner join应该解决问题的这一方面。

此外,索引会有所帮助。我建议您使用以下内容:t2(col1, col2, id)t1(new_id, col1, col2)