He estado viendo algunas actualizaciones muy básicas que se han agotado recientemente y no he podido determinar la causa. Un ejemplo:
// # Query_time: 51 Lock_time: 0 Rows_sent: 0 Rows_examined: 0
UPDATE
photos
SET position = position + 1 WHERE (photo_album_id = 40470);
El mismo registro no tiene entradas con Lock_time> 0. La ejecución show innodb status
tampoco revela ningún bloqueo relacionado. Este problema parece estar afectando al menos a 5 tablas diferentes basadas en los registros de mi servidor de aplicaciones (que muestran un Mysql::Error: Lock wait timeout exceeded
error relacionado con cada entrada correspondiente en el registro mysql-slow).
¿Alguna idea de a dónde ir desde aquí? Estoy llegando a callejones sin salida en todas las direcciones. Gracias.
EDITAR:
CREAR TABLA `fotos` ( `id` int (11) NOT NULL auto_increment, `type` varchar (255) NOT NULL, `photo_album_id` int (11) NOT NULL, `user_id` int (11) NOT NULL, `title` varchar (255) predeterminado 'Sin título', texto de "descripción", `credit` varchar (255) default NULL, `photo_file_name` varchar (255) predeterminado NULL, `photo_content_type` varchar (255) predeterminado NULL, `photo_file_size` int (11) predeterminado NULL, `photo_updated_at` datetime default NULL, `position` int (11) por defecto '0', `views` int (11) predeterminado '0', `folder` varchar (255) predeterminado NULL, `publicado` tinyint (1) predeterminado '0', `updated_at` datetime default NULL, `created_at` datetime default NULL, `updated_at` datetime default NULL, `album_published` tinyint (1) predeterminado '0', `comment_count` int (11) predeterminado '0', `audio_file_name` varchar (255) predeterminado NULL, `audio_content_type` varchar (255) predeterminado NULL, `audio_file_size` int (11) predeterminado NULL, `audio_updated_at` datetime default NULL, `cover` tinyint (1) predeterminado '0', `slug` varchar (255) predeterminado NULL, `comments_count` int (11) predeterminado '0', `delete_from_s3` tinyint (1) predeterminado '0', `batch` int (11) predeterminado NULL, `audio` varchar (255) predeterminado NULL, CLAVE PRIMARIA (`id`), KEY `index_photos_on_album_published` (` album_published`), TECLA `index_photos_on_batch` (` lote`), CLAVE `index_photos_on_comment_count` (` comment_count`), TECLA `index_photos_on_created_at` (` created_at`), TECLA `index_photos_on_delete_from_s3` (` delete_from_s3`), TECLA `index_photos_on_photo_album_id` (` photo_album_id`), CLAVE `index_photos_on_published` (` publicado`), CLAVE `index_photos_on_published_at` (` publishing_at`), KEY `index_photos_on_type` (` type`), CLAVE `index_photos_on_user_id` (` user_id`) ) MOTOR = InnoDB AUTO_INCREMENT = 42830 CHARSET POR DEFECTO = utf8
fuente
UPDATE table SET <field>=<field>+1 WHERE <pk_field>=1;
sin embargo, mi mesa es mucho más simple. Al azar, esto causa el mismo error que está recibiendo. Mi versión es: 5.1.39. Hoy paso un tiempo tratando de resolverlo, así que actualizaré si encuentro algo.Respuestas:
Sé que esto es realmente tarde, pero realmente necesitas capturar la salida de SHOW ENGINE INNODB STATUS; durante esa consulta para ver por qué está esperando.
Si sucede mucho durante un tiempo específico, sería fácil tomar esa salida cada x segundos y esperar que la capture (o tal vez genere artificialmente la carga).
fuente
Yo diría que normalizar la base de datos y agregar índices propios.
Una sola foto no necesita llevar toda la información sobre el álbum al que pertenece, esto exige una tabla separada para álbumes, y una tabla de relaciones que solo contenga el mapeo de photoID <-> albumID, lo mismo se aplica, si está incluido, al fotógrafo (tabla separada y una tabla de mapeo entre photoID y photographerID
Al principio, puede parecer que sus consultas se vuelven un poco más complicadas, pero la información ahora está dividida lógicamente y, al mismo tiempo, utiliza un RDBMS para lo que se trata ... los datos y sus relaciones
fuente