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…
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 usar
LAST_INSERT_ID()
para obtener el valorAUTO_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
Hay que tener en cuenta que INSERT DELAYED está deprecated en la versión 5.6 de MySQL y eliminado en la 5.7 y uso de esta funcionalidad tiene más inconvenientes que ventajas (http://dev.mysql.com/doc/refman/5.6/en/insert-delayed.html).