О производительности обновления в MySQL - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть две таблицы.

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

Теперь мне нужно обновить поле 'user_id' в tb_test с 'id' в tb_user.Я написал 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 голосов
/ 04 декабря 2018

Во-первых, я бы порекомендовал написать это как 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...