Hemos encontrado un problema después de mover la base de datos de nuestro cliente a un servidor adicional. Esto debería haber tenido efectos positivos en el rendimiento del sitio, pero hay un problema con el bloqueo de la tabla en MyISAM. (He oído hablar de usar InnoDB en lugar de MyISAM, pero no podemos cambiar el motor en el futuro cercano).
Podríamos detectarlo en una consulta de actualización que se realiza cuando un moderador activa un comentario en el sitio del artículo. Este es el proceso:
- Se procesa la consulta de actualización
SET status = 1 WHERE id = 5
(se establece el índice) - los archivos en caché de la página se eliminan
En este punto, toda la página se vuelve lenta. La base de datos está ocupada por minutos. Busqué la lista de procesos varias veces y vi unas 60 entradas de diferentes consultas de selección, que estaban todas en el estado esperando el bloqueo a nivel de tabla .
1. No entiendo por qué esta actualización en la tabla article_comments
puede afectar las declaraciones de selección para que la tabla article
espere el bloqueo a nivel de tabla. En la lista de procesos, casi todas las consultas en espera eran de esta tabla. He leído sobre el hecho de que se prefieren las actualizaciones / inserciones a las selecciones y que esto puede causar tales problemas, pero la tabla de artículos en sí no se actualiza cuando se activan los comentarios, por lo que las selecciones no deberían esperar. ¿Entendí mal eso?
2. ¿Hay algo además de cambiar a InnoDB para evitar este comportamiento o al menos para obtener un mejor equilibrio? Estoy muy irritado por el hecho de que este problema no apareció antes de mover la base de datos al nuevo servidor. Supongo que hay una mala configuración, pero no sé cómo identificarme.
key_buffer_size
estaba configurado para 1GB
. Aumentar eso para 10GB
reducir el problema.