用另一个 MySQL 表的值更新一个 MySQL 表
Posted
技术标签:
【中文标题】用另一个 MySQL 表的值更新一个 MySQL 表【英文标题】:Update one MySQL table with values from another 【发布时间】:2011-04-20 08:57:14 【问题描述】:我正在尝试根据另一个 mysql 表的信息更新一个表。
我的original
表如下:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
tobeupdated
表看起来像:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
我想根据value
(存储在VARCHAR(32)
字段中的字符串)使用original
中的id
更新tobeupdated
中的id
。
希望更新后的表格如下所示:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
我有一个有效的查询,但速度很慢:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
这会耗尽我的 CPU 并最终导致仅执行一小部分更新的超时(有数千个值要匹配)。我知道value
匹配会很慢,但这是我必须将它们匹配在一起的唯一数据。
有没有更好的方法来更新这样的值?我可以为合并的结果创建第三个表,如果这样会更快?
我尝试了MySQL - How can I update a table with values from another table?,但并没有真正帮助。有什么想法吗?
提前感谢您帮助 MySQL 新手!
【问题讨论】:
你的“价值”列有索引吗? 你好面条;不,value
目前没有索引。
【参考方案1】:
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id
应该这样做,而且它确实在做你的事情。但是,我更喜欢连接的 'JOIN' 语法而不是多个 'WHERE' 条件,我认为它更容易阅读
至于运行缓慢,表有多大?您应该在 tobeupdated.value
和 original.value
上有索引
编辑: 我们还可以简化查询
UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id
USING
是当连接的两个表具有相同的名称 key
(例如 id
)时的简写。即 equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join
【讨论】:
感谢wired00!这完美地工作。这些表非常大(original
有 100,000+ 个条目,tobeupdated
10,000+),所以我采纳了您和 noodl 关于索引的建议,整个查询现在在一秒钟内完成。我无法相信差异!?非常感谢你的帮助;我学到了很多东西!
很高兴听到 :) 我在这里也学到了很多东西。我真的很喜欢这个网站,因为您可以接触到许多不同的问题和想法
谢谢..我从***尝试了很多东西..这个终于奏效了
只想提一下,使用 WHERE 的简单 UPDATE 比 JOIN 语法快得多。大约 10.000 行。
它们的关键成分当然是指定为索引。带我在 4 秒内更新 30 万条记录,而不是没有它们的超时。【参考方案2】:
这取决于这些表的用途,但您可以考虑在插入和更新时将触发器放在原始表上。插入或更新完成后,仅根据原始表中的一项更新第二个表。会更快。
【讨论】:
感谢 firegnom;我以前从未使用过触发器,但我一定会仔细阅读它们。以上是关于用另一个 MySQL 表的值更新一个 MySQL 表的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 用另一个表的值更新一个表 - 我可以在 bigquery 中使用它吗?