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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.