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 status
també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 exceeded
erro 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
mysql
query
innodb
locked-objects
mvbl fst
fonte
fonte
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.Respostas:
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).
fonte
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
fonte