Estoy intentando actualizar una tabla MySQL en función de la información de otra.
Mi originalmesa se parece a:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Y la tobeupdatedmesa se ve así:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Quiero actualizar iden tobeupdatedel idde originalbase 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 valueserá 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!

valueno 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.valueyoriginal.valueEDITAR: también podemos simplificar la consulta
USINGes 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
originalson más de 100,000 entradas ytobeupdatedmá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