Délais d'attente InnoDB inexpliqués

10

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 statusne 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 exceedederreur 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
mvbl fst
la source
Question idiote: quels indices avez-vous sur cette table?
Gaius
Salut, veuillez voir la modification.
mvbl fst
Hmm, c'est ennuyeux car c'est si facile à diagnostiquer dans Oracle, vous venez de définir 10046 niveau de trace 12 et il vous dira exactement ce qu'il fait. J'y réfléchirai un peu plus.
Gaius
J'ai un problème similaire avec une table InnoDB, je pense que cela a quelque chose à voir avec l'incrément. Je fais: 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.
Merci, veuillez me faire savoir ce que vous découvrez, nous n'avons toujours pas compris celui-ci.
mvbl fst

Réponses:

3

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

RS
la source
0

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

eagle275
la source