update - Actualice una tabla MySQL con valores de otra
copiar registros de una tabla a otra mysql (2)
Depende del uso de esas tablas, pero puede considerar colocar el activador en la tabla original al insertar y actualizar. Cuando finalice la inserción o actualización, actualice la segunda tabla basándose en un solo elemento de la tabla original. Será más rápido.
Estoy tratando de actualizar una tabla MySQL basada en información de otra.
Mi tabla original
se ve así:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Y la tabla tobeupdated
se ve así:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Quiero actualizar el id
en tobeupdated
con el id
del original
función del value
(cadenas almacenadas en el campo VARCHAR(32)
).
La tabla actualizada se verá como:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
Tengo una consulta que funciona, pero es muy lenta:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Esto maximiza mi CPU y finalmente conduce a un tiempo de espera con solo una fracción de las actualizaciones realizadas (hay varios miles de valores para que coincidan). Sé que igualar por value
será lento, pero este es el único dato que tengo para unirlos.
¿Hay alguna forma mejor de actualizar valores como este? Podría crear una tercera tabla para los resultados combinados, si eso fuera más rápido?
Intenté MySQL - ¿Cómo puedo actualizar una tabla con valores de otra tabla? , pero realmente no ayudó. ¿Algunas ideas?
¡Gracias de antemano por ayudar a un principiante de MySQL!
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id
Eso debería hacerlo, y realmente está haciendo exactamente lo que es tuyo. Sin embargo, prefiero la sintaxis ''JOIN'' para las uniones en lugar de varias condiciones ''WHERE'', creo que es más fácil de leer
En cuanto a correr lento, ¿qué tan grandes son las tablas? Debería tener los índices en los tobeupdated.value
y original.value
EDITAR: también podemos simplificar la consulta
UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id
USING
es una abreviatura cuando ambas tablas de un join tienen una key
nombre idéntico, como id
. es decir, un equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join