Evitar sobre manera los updates y deletes. Explicación:
Por ejemplo, en un sistema de mensajeria se suele tener un campo destinado a almacenar el numero total de mensajes del usuario. Y cuando el usuario mande un mensaje, se actualice ese campo (y el campo correspondiente al usuario al que va destinado el mensaje). Total, eso implica que para mandar un mensaje se hace un select y dos updates. La operación de ver cuantos mensajes tiene ese usuario es un select de ese campo.
Otra forma de hacerlo es no guardar para nada ese campo. Asi cuando un usuario quiere ver el número de mensajes que tiene, se hace un select count de sus mensajes.
La primera forma parece mas óptima, pero en realidad con cargas grandes en un sistema con mysql no lo es. El motivo es que mysql bloquea toda la tabla cuando se hacen updates/deletes. Como tenemos dos updates en una operacion de enviar un mensaje, el porcentaje de tiempo de tabla bloqueada seria muy grande cuando llegan los momentos criticos de uso del sistema.
La segunda opcion, menos 'eficiente' desde el punto de vista de número de operaciones y complejidad a realizar, y que encima realiza operaciones redundantes, es mucho mejor desde el punto de vista de la concurrencia, porque evita bloqueos.
En mysql, a costa de unos insert ultra-rápidos, los updates son muy costosos, por eso es necesario evitarlos a toda costa.
Por ejemplo, en un sistema de mensajeria se suele tener un campo destinado a almacenar el numero total de mensajes del usuario. Y cuando el usuario mande un mensaje, se actualice ese campo (y el campo correspondiente al usuario al que va destinado el mensaje). Total, eso implica que para mandar un mensaje se hace un select y dos updates. La operación de ver cuantos mensajes tiene ese usuario es un select de ese campo.
Otra forma de hacerlo es no guardar para nada ese campo. Asi cuando un usuario quiere ver el número de mensajes que tiene, se hace un select count de sus mensajes.
La primera forma parece mas óptima, pero en realidad con cargas grandes en un sistema con mysql no lo es. El motivo es que mysql bloquea toda la tabla cuando se hacen updates/deletes. Como tenemos dos updates en una operacion de enviar un mensaje, el porcentaje de tiempo de tabla bloqueada seria muy grande cuando llegan los momentos criticos de uso del sistema.
La segunda opcion, menos 'eficiente' desde el punto de vista de número de operaciones y complejidad a realizar, y que encima realiza operaciones redundantes, es mucho mejor desde el punto de vista de la concurrencia, porque evita bloqueos.
En mysql, a costa de unos insert ultra-rápidos, los updates son muy costosos, por eso es necesario evitarlos a toda costa.
No hay comentarios:
Publicar un comentario