关于mysql中的更新性能

时间:2018-12-04 08:24:26

标签: mysql sql

我有两个桌子。

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

1 个答案:

答案 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;