J'ai vu des mises à jour très basiques arriver à expiration récemment et je n'ai pas pu en déterminer la cause. Un exemple:
// # Query_time: 51 Lock_time: 0 Rows_sent: 0 Rows_examined: 0
UPDATE
photos
SET position = position + 1 WHERE (photo_album_id = 40470);
Le même journal n'a aucune entrée avec un Lock_time> 0. L'exécution show innodb status
ne révèle pas non plus de verrous associés. Ce problème semble affecter au moins 5 tables différentes en fonction des journaux de mon serveur d'applications (qui affichent une Mysql::Error: Lock wait timeout exceeded
erreur liée à chaque entrée correspondante dans le journal mysql-slow).
Une idée sur où aller d'ici? Je frappe des impasses dans toutes les directions. Merci.
ÉDITER:
CRÉER UN TABLEAU `photos` ( `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) default 'Untitled', texte `description`, `credit` varchar (255) NULL par défaut, `photo_file_name` varchar (255) par défaut NULL, `photo_content_type` varchar (255) par défaut NULL, `photo_file_size` int (11) NULL par défaut, `photo_updated_at` datetime par défaut NULL, `position` int (11) par défaut '0', `vues` int (11) par défaut '0', `dossier` varchar (255) par défaut NULL, `published` tinyint (1) par défaut '0', `published_at` datetime default NULL, `created_at` datetime default NULL, `updated_at` datetime default NULL, `album_published` tinyint (1) par défaut '0', `comment_count` int (11) par défaut '0', `audio_file_name` varchar (255) par défaut NULL, `audio_content_type` varchar (255) par défaut NULL, `audio_file_size` int (11) NULL par défaut, `audio_updated_at` datetime par défaut NULL, `cover` tinyint (1) default '0', `slug` varchar (255) par défaut NULL, `comments_count` int (11) par défaut '0', `delete_from_s3` tinyint (1) par défaut '0', `batch` int (11) NULL par défaut, `audio` varchar (255) par défaut NULL, CLÉ PRIMAIRE (`id`), KEY `index_photos_on_album_published` (` album_published`), KEY `index_photos_on_batch` (` batch`), 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` (` published`), KEY `index_photos_on_published_at` (` published_at`), KEY `index_photos_on_type` (` type`), KEY `index_photos_on_user_id` (` user_id`) ) MOTEUR = InnoDB AUTO_INCREMENT = 42830 DEFAULT CHARSET = utf8
mysql
query
innodb
locked-objects
mvbl fst
la source
la source
UPDATE table SET <field>=<field>+1 WHERE <pk_field>=1;
Ma table est beaucoup plus simple cependant. Au hasard, cela provoque la même erreur que vous obtenez. Ma version est: 5.1.39. Je passe un peu de temps aujourd'hui à essayer de le comprendre, donc je mettrai à jour si je trouve quelque chose.Réponses:
Je sais que c'est vraiment tard, mais vous avez vraiment besoin de capturer la sortie de SHOW ENGINE INNODB STATUS; au cours de cette requête pour voir pourquoi il attend.
Si cela se produit souvent au cours d'une période spécifique, il serait facile de saisir cette sortie toutes les x secondes et d'espérer que vous la capturiez (ou génériez peut-être artificiellement la charge).
la source
Je dirais normaliser la base de données - et ajouter des indicateurs de propper.
Une seule photo n'a pas besoin de transporter toutes les informations sur l'album auquel elle appartient - cela demande une table séparée pour les albums - et une table de relations qui ne contient que le mappage de photoID <-> albumID la même chose s'applique - si elle est incluse - au photographe (table séparée et table de correspondance entre photoID et photographeID
Il peut sembler au début que vos requêtes deviennent un peu plus compliquées mais les informations sont maintenant divisées logiquement et en même temps vous utilisez un SGBDR pour ce dont il s'agit. Les données et leurs relations
la source