我有两个桌子。
tb_users
id (pk)
login_name
tb_test
id (pk)
user_id
user_code
采样日期如下
tb_users (id, login_name)
11e8, tom
11e3, jerry
11e1, peter
... 49316 more items
tb_test (id,user_id,user_code)
ff3f10b01, ,tom
ff3f10b02, ,tom
ff3f10b03, ,tom
ff3f10b04, ,peter
... 70000 more items
现在,我需要用tb_user中的'id'更新tb_test中的字段'user_id'。我写了sql。
update tb_test a
set a.user_id = (select b.id
from tb_user b
where a.user_code = b.login_name )
需要1分钟以上!我编写了select sql,它运行非常快。 我应该如何提高更新效率?
select a.*, b.id
from tb_test a, tb_user b
where a.user_code = b.login_name
结果应该是这样
tb_test (id,user_id,user_code)
ff3f10b01, 11e8 ,tom
ff3f10b02, 11e8 ,tom
ff3f10b03, 11e8 ,tom
ff3f10b04, 11e1 ,peter
... 70000 more items
答案 0 :(得分:1)
首先,我建议将其写为join
:
update tb_test t join
tb_user u
on t.user_code = u.login_name
set t.user_id = u.id;
然后,为了提高性能,您需要在tb_user(login_name, id)
上建立索引。
也就是说,您正在更新几乎所有行。在许多情况下,仅重新创建表会更便宜:
create table temp_tb_test as
select t.id, u.id as user_id, t.user_code
from tb_test t left join
tb_user u
on t.user_code = u.login_name;
truncate table tb_test; -- be very cautious here!
insert into tb_test(id, user_id, user_code)
select id, user_id, user_code
from temp_tb_test;