Antes que nada, permítanme decir que estoy usando el marco PHP Yii, por lo que me gustaría permanecer dentro de su conjunto definido de instrucciones SQL si es posible. Sé que probablemente podría crear una gran declaración SQL larga que haría todo, pero prefiero no ir allí.En MySQL, ¿es más rápido eliminar e insertar o es más rápido actualizar las filas existentes?
OK, imagina que tengo una tabla Usuarios y una tabla FavColors. Luego tengo un formulario donde los usuarios pueden seleccionar sus preferencias de color marcando una o más casillas de verificación de una gran lista de colores posibles.
Esos resultados se almacenan como filas múltiples en la tabla FavColors como esta (id, user_id, color_id).
Ahora imagine que el usuario entra y cambia su preferencia de color. En este escenario, ¿cuál sería la forma más eficiente de obtener las nuevas preferencias de color en la base de datos?
Opción 1:
- Hacer una masa borrar de todas las filas donde user_id coincide
- luego hacer una inserción masiva de todas las nuevas filas
Opción 2:
- Pase por cada c urrent row para ver qué ha cambiado y actualizar en consecuencia
- Si es necesario insertar más filas, hazlo.
- Si las filas deben borrarse, hágalo.
Me gusta la opción uno porque solo requiere dos afirmaciones, pero algo simplemente se siente mal al eliminar una fila para devolver prácticamente casi los mismos datos. También está la cuestión de hacer que los identificadores aumenten automáticamente a valores más altos más rápidamente, y no sé si eso debería evitarse siempre que sea posible.
La opción 2 requerirá mucho más trabajo de programación, pero evitaría situaciones en las que eliminaría una fila solo para crearla nuevamente. Sin embargo, agregar más carga en PHP puede no valer la disminución en la carga de MySQL.
¿Alguna idea? ¿Qué harían todos ustedes?
Si actualiza un campo indexado, el índice también se actualiza –
@OMG sí! Olvidé mencionar eso. Bien que lo hiciste ... –
Gracias, eso tiene sentido. Desafortunadamente, cuando se usa un marco basado en ActiveRecord, no siempre es fácil crear una declaración SQL personalizada e incluir "INSERTAR ... EN ACTUALIZACIÓN DE LLAVE DUPLICADA". Si hago eso, tendré que crear una consulta manualmente, y esa consulta probablemente no se traducirá si necesito cambiar el DBMS en el futuro. –