Optimización web con inserciones retrasadas en SQL.

Optimizar el código es fundamental para mejorar la velocidad de cualquier página web pero sin duda planear de forma adecuada su lanzamiento reducirá los riesgos a caídas en el futuro…

optimización
Fuente: https://www.flickr.com/photos/moosh_claroline/

Las sentencias “INSERT DELAYED” de MYSQL permiten ejecutar inserciones retrasadas en una base de datos con ciertas ventajas fundamentales que permiten aumentar la velocidad de carga de una web.

Para poder utilizar este concepto la carga del MYSQL no debe utilizar cluster distribuido en varios servidores ya que en este caso las sentencias serán simples INSERT y su operativa DELAYED será ignorada.

La opción DELAYED para el comando INSERT es una extensión de MySQL del estándar SQL muy útil si tiene clientes que no pueden esperar a que se complete el INSERT .  La gran ventaja consiste en que la orden se encola para insertarse cuando la tabla no está en uso por otro flujo (evitando bloqueos) y  las inserciones desde varios clientes se tratan juntas y se escriben en un bloque lo cual es mucho más rápido que realizar inserciones separadas.

Se deben tener en cuentas las siguientes consideraciones:

  • Debido a que el comando retorna inmediatamente antes que los registros se inserten, no puede usarLAST_INSERT_ID() para obtener el valor AUTO_INCREMENT que el comando genera. Por lo tanto su uso debe ser controlado mediante un CRON en el servidor.

 

  • Debido a que los registros encolados se tratan sólo en memoria hasta que se insertan en la tabla, si se produce una parada del servidor MYSQL a mitad se perderán las sentencias. Para evitarlo se debe implementar un sistema de tareas mediante un campo de control “ID” que permita reconocer aquellas tareas que se quedaron pendientes y así procesarlas al volver a estar disponible el servidor.

En AGENCIA LA NAVE recordamos no utilizar INSERT DELAYED en todas las sentencias ya que su uso puede ser útil en algunos casos o incrementar el uso de la CPU si se abusa de el procedimiento: Hay una sobrecarga adicional para el servidor debido a que tiene que tratar un flujo separado para cada tabla en que haya registros retardados.

Queda claro que al no ejecutarse en el momento las inserciones se debe utilizar el DELAYED para operaciones que pueden ser analizadas a posteriori. Por ejemplo si se utilizar un INSERT DELAYED para contar visitas a una página web es preferible que se hagan todas de golpe cuando la tabla no esté en uso.

La mayoría de las webs que se caen sin ataques con un uso normal se debe a una mala optimización del código y en especial por no haber tenido en cuenta los bloqueos producidos por sentencias SQL incompatibles.

Si bien los INSERT DELAYED son muy útiles en un futuro podríamos llegar más lejos y que el MYSQL del futuro permita inserciones programadas SQL en plan “Insertar cuando el uso de la CPU sea inferior a un %” o “Insertar a una hora programada.”. De momento nos tocará crear un hilo separado para este tipo de procedimientos.

Para finalizar solo indicar que los datos introducidos por este procedimiento deben combinarse con sistemas de cache para mejorar su rendimiento. Nunca olvidemos que los registros DELAYED no son visibles por los comandos SELECT hasta que se hayan insertado realmente.

Quedamos a vuestra disposición para cualquier aclaración sin compromiso alguno. +info

One thought on “Optimización web con inserciones retrasadas en SQL.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *