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 para1GB
. Aumentar eso para10GB
reducir el problema.Respuestas:
MyISAM Storage Engine es muy conocido por realizar bloqueos de tabla completos para cualquier DML (INSERTOS, ACTUALIZACIONES, DELETES). InnoDB definitivamente resolvería ese problema a largo plazo.
Escribí sobre los pros y los contras de usar MyISAM vs InnoDB
Con respecto a su pregunta actual, aquí hay un posible escenario:
article
yarticle_comments
son ambas tablas MyISAMarticle_comments
tiene uno o más índices constatus
una columnaarticle_comments
se almacenan en caché en MyISAM Key Buffer (dimensionado por key_buffer_size ), lo que hace que las páginas de índice antiguas salgan de MyISAM Key Bufferarticle
yarticle_comments
En mi escenario sugerido, los SELECT contra la
article
tabla pueden retrasarse para permitir escrituras debido a que tienen que esperar paraarticle_comments
estar libres de cualquier DML (en este caso, unUPDATE
)fuente
¿Hueles como si tuvieras una gran Query_cache?
Para sistemas de producción con muchas escrituras, también puede desactivar el query_cache.
Todas las entradas en query_cache para la tabla dada se purgan cuando se produce una escritura en esa tabla. Cuanto más grande es el control de calidad, más lenta es esta tarea.
MyISAM utiliza bloqueos de "nivel de tabla". Las lecturas y escrituras no pueden ocurrir al mismo tiempo (en la misma tabla). Crudo, pero efectivo.
fuente