Estou tentando atualizar uma tabela do MySQL com base nas informações de outra.
Minha original
mesa se parece com:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
E a tobeupdated
mesa se parece com:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Quero atualizar id
em tobeupdated
com o id
de original
base em value
(cordas armazenados em VARCHAR(32)
campo).
A tabela atualizada terá a seguinte aparência:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
Tenho uma consulta que funciona, mas é muito lenta:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Isso maximiza minha CPU e, eventualmente, leva a um tempo limite com apenas uma fração das atualizações realizadas (há vários milhares de valores para corresponder). Sei que a correspondência value
será lenta, mas esses são os únicos dados que tenho para combiná-los.
Existe uma maneira melhor de atualizar valores como este? Eu poderia criar uma terceira tabela para os resultados mesclados, se isso fosse mais rápido?
Tentei o MySQL - como posso atualizar uma tabela com valores de outra tabela? , mas não ajudou muito. Alguma ideia?
Agradecemos antecipadamente por ajudar um novato em MySQL!
value
não tem índice no momento.Respostas:
Isso deve bastar, e realmente está fazendo exatamente o que o seu é. No entanto, eu prefiro a sintaxe 'JOIN' para junções em vez de várias condições 'WHERE', acho que é mais fácil de ler
Quanto à lentidão, qual o tamanho das tabelas? Você deve ter índices em
tobeupdated.value
eoriginal.value
EDIT: também podemos simplificar a consulta
USING
é uma abreviação quando ambas as tabelas de uma junção têm um nome idênticokey
, comoid
. ou seja, um equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-joinfonte
original
tem mais de 100.000 entradas etobeupdated
mais de 10.000), então segui o conselho seu e de noodl sobre os índices e a consulta inteira agora termina em menos de um segundo. Não acredito na diferença !? Muito obrigado pela sua ajuda; Aprendi muito!Depende de qual é o uso dessas tabelas, mas você pode considerar colocar o gatilho na tabela original ao inserir e atualizar. Quando a inserção ou atualização for concluída, atualize a segunda tabela com base em apenas um item da tabela original. Vai ser mais rápido.
fonte