2009-01-21 13 views
8

Parte del sistema en el que estoy trabajando en este momento implica un registro en mysql, con recuentos que se actualizan con frecuencia.Función MySQL para insertar el registro si falla la actualización?

se insertan los datos son del formato:

date | name | count | 
-----------+------+-------+ 
2009-01-12 | alan | 5 | 
2009-01-12 | dave | 2 | 
2009-01-12 | mary | 1 | 

Estos datos se analiza regularmente desde un archivo plano, que se resumen como anteriormente en la preparación de una base de datos de inserción/actualización - la clave única en la base de datos es el (date, name) par.

Anteriormente, este sistema verificaría la tabla existente para cualquier registro para un par dado date y name antes de decidirse por una actualización o inserción.

El problema que tenemos es que, a medida que crece esta tabla, el tiempo de respuesta no mejora, y queremos reducir el número de consultas tanto como sea posible.

El sistema se ha actualizado recientemente para ejecutar una consulta INSERT ... ON DUPLICATE KEY UPDATE, lo que ha reducido el número de select s marginalmente, pero nuestro caso común por una cierta distancia es la update.

Me pregunto si alguien sabe de una función mysql que es esencialmente INSERT ... ON DUPLICATE KEY UPDATE en reversa, es decir, intentará actualizar una fila, si ninguna coincide, entonces realice la inserción?


Editar

no hice demasiado claro por encima, lo que me gustaría hacer cuando tengo el registro ('2009-01-12','alan','5') por ejemplo, es:

UPDATE table SET count = count+5 WHERE date = '2009-01-12' and name = 'alan'; 

y si el arriba falla, inserte los datos anteriores. La necesidad de incrementar un contador es la razón por la cual REPLACE no funcionará. Reemplazar realiza una & inserción de eliminación, y no permite que se refieren a la fila que se está eliminado, por lo que no habría count = count + 5 incrementar el valor anterior por count 5.

@jasoncohen - la INSERT ... ON DUPLICATE KEY UPDATE hace el trabajo, pero yo' Estoy preguntando si hay una manera más óptima de hacer esto.

¡Perdón por cualquier confusión que resulte del pobre fraseo original!

Respuesta

3

Es lo mismo. Con "ACTUALIZAR ... SIN INSTRUMENTOS DE TECLAS", el motor de la base de datos tendrá que verificar primero si hay algo que actualizar. Por lo tanto, no es necesario un constructo separado, aunque la actualización es más común

+0

¡Tiene sentido, estaba pidiendo más con esperanza que con la expectativa de que hubiera alguna consulta mágica y de super-rendimiento para esto! – ConroyP

+0

Un ejemplo de uso sería bueno. –

+0

@HelgaIliashenko solicitando primero preguntar por un ejemplo de uso antes de la votación negativa sería bueno –

0

¿Por qué no es suficiente el INSERT? Incluso si la mayoría de las veces es una clave duplicada y, por lo tanto, una actualización (en lugar de al revés), sigue siendo la operación correcta ¿no?

¿Solo preguntas por el rendimiento?

1

He estado tratando de descubrir qué cosa es lo que quiere, y como yo lo veo, no quiere hacer nada si los datos coinciden ?No veo una solución para eso, si el "recuento" de alguna manera cambiará y es necesario actualizarlo, está atascado con INSERT INTO ON DUPLICATE KEY UPDATE (que realmente no veo el problema).

Sin embargo, si el recuento nunca se actualizará, es posible que desee examinar INSERT IGNORE INTO, que ignorará la inserción si la clave única (fecha + nombre) ya existe.

¿No ha considerado "enjuagar/rotar" su archivo plano solo para comprobar si hay material adicional? ¿O no es eso posible?

Editar:

El INSERT fallará al instante a causa de la violación de clave duplicada, y activar la actualización en ese caso. No debería haber ningún problema de rendimiento en absoluto. Hago esto todo el tiempo en una base de datos bastante grande, y no he notado ninguna gran diferencia de rendimiento cuando comienzo desde una base de datos vacía en lugar de una base de datos ya poblada.

Sin embargo, probablemente sea bueno ejecutar ANALYZE TABLE/OPTIMIZE TABLE de vez en cuando para mantener el índice en buen estado.

Cuestiones relacionadas