Tiempos de espera inexplicables de InnoDB

10

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 statustampoco 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 exceedederror 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
mvbl fst
fuente
Pregunta tonta: ¿qué índices tienes en esa mesa?
Cayo
Hola, mira la edición.
mvbl fst
Hmm, esto es molesto porque es tan fácil de diagnosticar en Oracle, que solo establece el nivel de rastreo 10046 12 y le dirá exactamente lo que está haciendo. Lo pensaré un poco más.
Gaius
Tengo un problema similar con una tabla InnoDB, creo que tiene algo que ver con el incremento. Lo estoy haciendo: 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.
Gracias, por favor, hágame saber lo que descubra, todavía no hemos descubierto esto.
mvbl fst

Respuestas:

3

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).

RS
fuente
0

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

águila275
fuente