我正在尝试根据另一个MySQL的信息更新一个MySQL表.
我的original
表看起来像:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Run Code Online (Sandbox Code Playgroud)
而tobeupdated
表如下所示:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Run Code Online (Sandbox Code Playgroud)
我想更新id
在tobeupdated
与id
来自original
基于value
(存储在字符串VARCHAR(32)
字段).
更新的表有望看起来像:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
Run Code Online (Sandbox Code Playgroud)
我有一个有效的查询,但它很慢:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Run Code Online (Sandbox Code Playgroud)
这最大化了我的CPU并最终导致超时,只执行了一小部分更新(有几千个值匹配).我知道匹配value
将会很慢,但这是我必须将它们匹配在一起的唯一数据.
有没有更好的方法来更新这样的值?我可以为合并结果创建第三个表,如果这样会更快?
我试过MySQL - 如何使用另一个表中的值更新表?,但它并没有真正帮助.有任何想法吗?
在此先感谢帮助MySQL新手!
wir*_*d00 187
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id
Run Code Online (Sandbox Code Playgroud)
应该这样做,而且它的确与你的完全一致.但是,我更喜欢连接的'JOIN'语法而不是多个'WHERE'条件,我认为它更容易阅读
至于跑步慢,桌子有多大?你应该有tobeupdated.value
和索引original.value
编辑:我们也可以简化查询
UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id
Run Code Online (Sandbox Code Playgroud)
USING
是速记当联接两个表具有相同的命名key
如id
.即equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join