表一有:
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
我认为这不对。它太慢了,它永远不会完成......提前感谢!
答案 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)
。