在750k行上执行MySQL更新查询

时间:2009-08-17 12:32:58

标签: sql mysql

我在MySQL表中添加了一个字段。我需要使用另一个表中的值填充新列。这是我想要运行的查询:

UPDATE       table1 t1
SET          t1.user_id = 
                        (
                        SELECT   t2.user_id 
                        FROM     table2 t2 
                        WHERE    t2.usr_id = t1.usr_id
                        )

我在239K行上本地运行该查询,大约需要10分钟。在我在现场环境中这样做之前,我想问一下我做的事情是否正常,即10分钟听起来合理。或者我应该以另一种方式,php循环?更好的查询?

3 个答案:

答案 0 :(得分:6)

使用UPDATE JOIN!这将为您提供一个本地inner join来更新,而不是为每个血腥行运行子查询。它往往更快

update table1 t1
inner join table2 t2 on
    t1.usr_id = t2.usr_id
set t1.user_id = t2.user_id

确保每个usr_id列都有索引。这会加快速度。

如果您的某些行不匹配,并且您想设置t1.user_id = null,则需要left join代替inner join。如果该列已经null,并且您只是想将其更新为t2中的值,请使用inner join,因为它更快。

对于子孙后代,我应该提一下,这只是MySQL语法 。其他RDBMS有不同的方式update join

答案 1 :(得分:0)

缺少两条相当重要的信息:

  1. 他们是什么类型的桌子?
  2. 它们上有哪些索引?
  3. 如果table2的索引包含user_idusr_id作为前两列,并且table1已在user_id上编入索引,则不应该那很糟糕。

答案 2 :(得分:0)

t2.usr_id上没有索引。

创建此索引并再次运行您的查询,或UPDATE提出的多表@Eric(当然还有LEFT JOIN)。

请注意,MySQL缺少JOIN以外的其他NESTED LOOPS方法,因此重要的是索引,而不是UPDATE语法。

但是,多表UPDATE更具可读性。