Tenho essas duas tabelas:
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
ambos os campos em user_profile estão ok, mas não tenho o user_profile_id_int de user_activity e quero atualizá-lo usando o mapa que tenho em user_profile. Eu escrevi uma consulta como esta:
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);
Ele estava rodando em um servidor muito forte por 1 dia e eu parei. Mas para gravar foi atualizado.
Então 2 perguntas aqui:
- Existe uma maneira melhor e mais rápida de fazer isso?
- Esta maneira está ok?
Resposta à pergunta 1
Isso deve fazer isso por você
Isso funcionará no MySQL. Se você não está acostumado com essa sintaxe JOIN, faça o seguinte:
Ambos devem funcionar.
Resposta à pergunta 2
Sua consulta, em teoria, funciona. No entanto, veja o que ele está fazendo:
Uma varredura de tabela em
user_activity
, uma pesquisa indexadauser_profile_id_int
usando a PRIMARY KEY deuser_profile
, e uma atualização no local da linha atual emuser_activity
.A consulta atinge duas tabelas e duas chaves primárias, alternadamente, por linha. Todos os passos desaceleram uns aos outros. Assim, você obtém uma consulta mais longa.
EMBARGO
Adicionar um índice composto
user_profile
deve acelerar as coisas:Acho que você pode tentar adicionar
LIMIT
à sua atualização (e modificar um poucoWHERE
para filtrar os registros já alterados). Se você fizer, por exemplo,LIMIT 100
, não levará 1 dia. Certamente, se você quiser alterar todos os registros, terá que escrever um script que executeUPDATE
até que o número de linhas atualizadas seja 0, mas não bloqueará a tabela inteira.