En MySQL, es más rápido para borrar y luego insertar o es más rápido para actualizar las filas existentes?

StackOverflow https://stackoverflow.com/questions/4020240

  •  26-09-2019
  •  | 
  •  

Pregunta

En primer lugar, permítanme decir que estoy usando el PHP marco Yu, así que me gustaría permanecer en su conjunto definido de instrucción SQL, si es posible. Sé que probablemente podría crear una instrucción SQL larga enorme que hacer todo, pero prefiero no ir allí.

OK, imagina que tengo una tabla de usuarios y una mesa FavColors. Entonces tengo un formulario donde los usuarios pueden seleccionar sus preferencias de color marcando una o más casillas de verificación de una larga lista de posibles colores.

Estos resultados se almacenan como múltiples filas de la tabla FavColors como este (id, user_id, color_id).

Ahora imagina que el usuario entra y cambia su preferencia de color. En este escenario, ¿cuál sería la forma más eficiente para conseguir las nuevas preferencias de color en la base de datos?

Opción 1:

  • Haga una masa de borrar todas las filas en partidos user_id
  • A continuación, hacer una inserción masiva de todas las nuevas filas

Opción 2:

  • Ir a través de cada fila actual para ver lo que ha cambiado, y actualizar en consecuencia
  • Si más filas deben insertarse, hacer eso.
  • Si filas necesitan ser eliminados, hacer eso.

Me gusta la opción uno, ya que sólo requiere dos declaraciones, pero algo sólo se siente mal acerca de cómo eliminar una fila sólo para potencialmente poner de nuevo casi exactamente los mismos datos. Hay también el problema de hacer que el identificadores de incremento automático a valores más altos más rápidamente, y no sé si eso se debe evitar siempre que sea posible.

Opción 2 requerirá un trabajo mucho más programación, pero evitaría situaciones en las que me gustaría eliminar una fila sólo para crear de nuevo. Sin embargo, la adición de más carga en PHP no puede ser digno de la disminución de la carga para MySQL.

¿Alguna idea? ¿Qué haría usted todo?

¿Fue útil?

Solución

UPDATE es, con mucho, mucho más rápido. Cuando UPDATE, los registros de la tabla simplemente se están reescribiendo con nuevos datos. Y todo esto debe hacerse de nuevo el INSERT.

Cuando DELETE, los índices deben ser actualizados (recordemos, se elimina toda la fila, no sólo las columnas que necesita modificar) y bloques de datos se pueden mover (si se golpea el límite PCTFREE). También la supresión y adición de identificadores de cambios en registros AUTO_INCREMENT, por lo que si esos registros tienen relaciones que se rompen, o necesitarían cambios también. Me gustaría ir a UPDATE.

Es por eso que se debe preferir en lugar de INSERT ... ON DUPLICATE KEY UPDATE REPLACE.

la anterior es una operación UPDATE en caso de una violación clave, mientras que el último es DELETE / INSERT

ACTUALIZACIÓN: Este es un ejemplo INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

Para más detalles leer la actualización documentación

Otros consejos

Philip, ¿Ha tratado de hacer declaraciones preparadas? Con declaraciones preparadas se puede tratar por una consulta con diferentes parámetros y llamarlo varias veces. Al final de su bucle, puede ejecutar todos ellos con la mínima cantidad de latencia de la red. He utilizado las declaraciones preparadas con php y funciona muy bien. Poco más confuso que java declaraciones preparadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top