2012-01-13 128 views
3

我必须根据电子邮件更新表中字段的值(250 000条记录)和来自另一个表(10 000 000条记录)的字段值...Mysql更新查询超过1000万条记录

我已经试过: UPDATE table1的T1,T2表2 SET = t1.country t2.country WHERE t1.email = t2.email

但我得到 “正在执行查询” 一个永远。

我应该使用什么查询?

感谢

+1

这是一次性的事情吗?或者你是否会一遍又一遍地做这个事情,比如说可能是晚上的事情? – davogotland 2012-01-13 17:35:19

+0

是的,这是一次性的东西 – 2012-01-13 17:43:45

+0

我会写一个小应用程序,慢慢地逐行执行,并通过打印出它已经走了多远来更新用户,以便主管可以检查它是否仍在运行。 – davogotland 2012-01-13 17:45:58

回答

2

这将是采用JOIN的好机会。

UPDATE table1 as t1 
JOIN table2 t2 ON t1.email = t2.email 
SET t1.country = t2.country 

它仍然需要一段时间为您的查询处理,但它应该减少了大量的时间。

+0

谢谢,但这给了我一个Sql语法错误... – 2012-01-13 17:44:13

+0

狮子座,我错过了'作为t1'在'更新'部分。丹善意修复它。 – 2012-01-16 13:15:31

0

我在查询中看不到明显的错误(并且数据库在此情况下会产生错误)。所以我们正在考虑的问题是加快执行更新。是您的两个电子邮件字段中的一个索引?如果不是,你可以添加一个索引并重试吗?例如。 ALTER TABLE table2 ADD INDEX(email)

+0

我也很好奇表现。我并不是很熟悉MySQL,但我希望看到相当于解释计划/执行路径以及成本,索引使用等等。 – Dan 2012-01-13 18:02:31

+0

性能调整非常棘手。它取决于你的硬件,系统负载等。从上面提取“小批量”:你可以尝试UPDATE table1 t1,table2 t2 SET t1.country = t2.country WHERE t1.email = t2.email LIMIT 10 – 2012-01-13 18:10:01

+0

This将只更新10条记录。验证结果。如果有效,您只需等到查询完成即可。 – 2012-01-13 18:11:46

相关问题