我有这两张表:
user_profile:
user_profile_id_int int primary key
user_profile_id varchar
user_activity:
user_profile_id_int int key
user_profile_id varchar
user_profile 中的两个字段都可以,但我没有来自 user_activity 的 user_profile_id_int,我想使用我在 user_profile 中的地图更新它。我写了一个这样的查询:
update user_activity a
set user_profile_id_int =
(select user_profile_id_int from user_profile b
where a.user_profile_id = b.user_profile_id);
它在一个非常强大的服务器上运行了 1 天,我停止了它。但要记录已更新。
所以这里有两个问题:
- 有没有更好更快的方法来做到这一点?
- 这种方式可以吗?
回答问题 1
这应该为你做
这将在 MySQL 中工作。如果您不习惯 JOIN 语法,请执行以下操作:
两者都应该工作。
回答问题 2
从理论上讲,您的查询有效。但是,看看它在做什么:
对 进行表扫描,使用 的 PRIMARY KEY 进行
user_activity
索引查找,以及对 中的当前行进行就地更新。user_profile_id_int
user_profile
user_activity
该查询在每行的基础上来回访问两个表和两个主键。所有的步骤都互相减慢。因此,您会得到一个运行时间更长的查询。
警告
添加复合索引
user_profile
应该可以加快速度:我认为您可以尝试添加
LIMIT
到更新中(并进行一些修改WHERE
以过滤掉已更改的记录)。例如,如果您这样做,LIMIT 100
则不需要 1 天。当然,如果要更改所有记录,则必须编写一个脚本,该脚本将一直执行UPDATE
到更新的行数为 0,但不会阻塞整个表。