En algunas ocasiones es posible que al estar revisando un servidor notes que hay un gran consumo de CPU y de recursos por parte de MySQL cuando eso no debería ser así. Verificando la lista de procesos de MySQL probablemente descubrirás que muchas consultas se han quedado en estado «sleep» (dormidas) durante varios segundos. Usualmente, una consulta de MySQL no debería demorar más de 1 segundo en ser atendida, por lo que si el tiempo indicado es mayor o considerablemente mayor, hay algún problema.
¿Qué se puede hacer cuando las consultas de MySQL se quedan en estado sleep?
1) Corregir y optimizar el código.
Esta es la forma más efectiva de resolver el problema. En caso de que uses conexiones persistentes, debes de ser consciente de que rara vez son utilizadas. Prácticamente la única situación en la que son útiles es cuando el servidor MySQL tiene una latencia elevada. Si el servidor web tarda demasiados milisegundos en comunicarse con el servidor MySQL, este tipo de conexión podría llegar a ser útil.
2) Restringir las conexiones.
Si hay usuarios que hacen un uso abusivo de las conexiones, siempre es posible restringirla para evitar problemas. Como MySQL no pone en fila las conexiones extra, simplemente se verá un mensaje del estilo «se ha excedido el máximo de conexiones MySQL permitidas».
Un ejemplo desde la consola MySQL:
GRANT ALL PRIVILEGES ON basededatos.* TO 'elusuario'@'localhost' WITH MAX_USER_CONNECTIONS = 25;
3) Reducir los timeouts.
Si corregir el código no es una opción y no deseas restringir las conexiones, entonces puede probar a reducir las variables wait_timeout e interactive_timeout. La primera afecta a las conexiones no interactivas, y la segunda a las que sí son interactivas. Puedes bajarlas a 30 segundos y probar cómo responde el servidor. Las visitas que lleguen a los sitios web no deberían notar la diferencia.