Tempo limite inexplicado do InnoDB

10

Ultimamente, tenho visto algumas atualizações muito básicas expirando e não consegui determinar a causa. Um exemplo:

// # Query_time: 51 Lock_time: 0 Rows_sent: 0 Rows_examined: 0

UPDATE photos SET position = position + 1 WHERE (photo_album_id = 40470);

O mesmo log não possui entradas com Lock_time> 0. A execução show innodb statustambém não revela nenhum bloqueio relacionado. Esse problema parece estar afetando pelo menos 5 tabelas diferentes com base nos meus logs do servidor de aplicativos (que mostram um Mysql::Error: Lock wait timeout exceedederro relacionado a cada entrada correspondente no log lento do mysql).

Alguma idéia de onde ir daqui? Estou atingindo becos sem saída em todas as direções. Obrigado.

EDITAR:

CREATE TABLE `fotos` (
  `id` int (11) NÃO NULL auto_increment,
  `type` varchar (255) NÃO NULL,
  `photo_album_id` int (11) NÃO NULL,
  `user_id` int (11) NÃO NULL,
  `title` varchar (255) padrão 'Sem título',
  texto `description`,
  `credit` varchar (255) padrão NULL,
  `photo_file_name` varchar (255) padrão NULL,
  `photo_content_type` varchar (255) padrão NULL,
  `photo_file_size` int (11) padrão NULL,
  `photo_updated_at` datetime padrão NULL,
  `position` int (11) padrão '0',
  `views` int (11) padrão '0',
  `folder` varchar (255) padrão NULL,
  `Publicado` tinyint (1) padrão '0',
  `publish_at` datetime padrão NULL,
  `created_at` datetime padrão NULL,
  `updated_at` datetime padrão NULL,
  `album_published` tinyint (1) padrão '0',
  `comment_count` int (11) padrão '0',
  `audio_file_name` varchar (255) padrão NULL,
  `audio_content_type` varchar (255) padrão NULL,
  `audio_file_size` int (11) padrão NULL,
  `audio_updated_at` datetime padrão NULL,
  `cover` tinyint (1) padrão '0',
  `slug` varchar (255) padrão NULL,
  `comments_count` int (11) padrão '0',
  `delete_from_s3` tinyint (1) padrão '0',
  `batch` int (11) padrão NULL,
  `audio` varchar (255) padrão NULL,
  CHAVE PRIMÁRIA (`id '),
  KEY `index_photos_on_album_published` (` album_published`),
  KEY `index_photos_on_batch` (` lote`),
  KEY `index_photos_on_comment_count` (` comment_count`),
  KEY `index_photos_on_created_at` (` created_at`),
  KEY `index_photos_on_delete_from_s3` (` delete_from_s3`),
  KEY `index_photos_on_photo_album_id` (` photo_album_id`),
  KEY `index_photos_on_published` (` publicado`),
  KEY `index_photos_on_published_at` (` Published_at`),
  KEY `index_photos_on_type` (` tipo`),
  KEY `index_photos_on_user_id` (` user_id`)
) MOTOR = InnoDB AUTO_INCREMENT = 42830 PADRÃO CHARSET = utf8
mvbl fst
fonte
Pergunta boba: quais índices você tem nessa tabela?
Gaius
Olá, veja a edição.
Mvbl fst
Hmm, isso é irritante, porque é tão fácil de diagnosticar no Oracle, você apenas define o nível de rastreamento 10046 12 e ele informa exatamente o que está fazendo. Vou pensar um pouco mais sobre isso.
Caio
Estou tendo um problema semelhante com uma tabela do InnoDB, acho que tem algo a ver com o incremento. Estou fazendo: UPDATE table SET <field>=<field>+1 WHERE <pk_field>=1;minha mesa é muito mais simples. Aleatoriamente, isso causa o mesmo erro que você está recebendo. Minha versão é: 5.1.39. Hoje, estou passando algum tempo tentando descobrir, então atualizo se encontrar alguma coisa.
Obrigado, por favor, deixe-me saber o que você descobriu, ainda não descobrimos isso.
Mvbl fst

Respostas:

3

Sei que é muito tarde, mas você realmente precisa capturar a saída de SHOW ENGINE INNODB STATUS; durante essa consulta para ver por que está esperando.

Se isso acontecer muito durante um período específico, seria fácil capturar essa saída a cada x segundos e esperar que você a capture (ou talvez gere artificialmente a carga).

RS
fonte
0

Eu diria que normalize o banco de dados - e adicione indits de propper.

Uma única foto não precisa levar todas as informações sobre o álbum ao qual pertence - isso exige uma tabela separada para álbuns - e uma tabela de relações que contém apenas o mapeamento de photoID <-> albumID, o mesmo se aplica - se incluído - ao fotógrafo (tabela separada e uma tabela de mapeamento entre photoID e photographerID

Pode parecer a princípio que suas consultas se tornem um pouco mais complicadas, mas as informações agora estão logicamente divididas e, ao mesmo tempo, você usa um RDBMS para o que se trata .. dados e suas relações

eagle275
fonte