Estoy intentando actualizar una tabla MySQL en función de la información de otra.
Mi original
mesa se parece a:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Y la tobeupdated
mesa se ve así:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Quiero actualizar id
en tobeupdated
el id
de original
base en value
(cadenas almacenadas en el VARCHAR(32)
campo).
Con suerte, la tabla actualizada se verá así:
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 eventualmente conduce a un tiempo de espera con solo una fracción de las actualizaciones realizadas (hay varios miles de valores para coincidir). Sé que la comparación value
será lenta, pero estos son los únicos datos que tengo para combinarlos.
¿Existe una mejor manera de actualizar valores como este? Podría crear una tercera tabla para los resultados combinados, si fuera más rápido.
Probé 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!
value
no tiene un índice en este momento.Respuestas:
Eso debería bastar, y realmente está haciendo exactamente lo que es el tuyo. Sin embargo, prefiero la sintaxis 'JOIN' para combinaciones en lugar de múltiples condiciones 'DONDE', creo que es más fácil de leer
En cuanto a correr lento, ¿qué tamaño tienen las mesas? Deberías tener índices en
tobeupdated.value
yoriginal.value
EDITAR: también podemos simplificar la consulta
USING
es una abreviatura cuando ambas tablas de una combinación tienen un nombre idénticokey
, comoid
. es decir, un equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-joinfuente
original
son más de 100,000 entradas ytobeupdated
más de 10,000 ), así que seguí tu consejo y el de Noodl sobre los índices y la consulta completa ahora termina en menos de un segundo. ¡¿No puedo creer la diferencia ?! Muchas gracias por su ayuda; ¡He aprendido mucho!Depende del uso de esas tablas, pero podría considerar poner el disparador 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.
fuente