我在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循环?更好的查询?
答案 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)
缺少两条相当重要的信息:
如果table2
的索引包含user_id
且usr_id
作为前两列,并且table1
已在user_id
上编入索引,则不应该那很糟糕。
答案 2 :(得分:0)
t2.usr_id
上没有索引。
创建此索引并再次运行您的查询,或UPDATE
提出的多表@Eric
(当然还有LEFT JOIN
)。
请注意,MySQL
缺少JOIN
以外的其他NESTED LOOPS
方法,因此重要的是索引,而不是UPDATE
语法。
但是,多表UPDATE
更具可读性。