web-dev-qa-db-fra.com

Coincé dans le statut de "extrémité de la requête" toutes les 5 minutes

J'en ai marre de voir des données dans le journal de requête lente, j'ai donc décidé de vérifier ce que le problème était tout.

Une requête UPDATE qui gree jusqu'à des dizaines de fois par seconde est parfois très lente. Voici la requête:

UPDATE `user` SET
    `last_active` = NOW(), 
    `last_ip` = '<ip>' 
WHERE `name` = '<name>' 
LIMIT 1

La table:

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(16) NOT NULL,
  `last_ip` varchar(50) NOT NULL DEFAULT 'none',
  `last_active` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `last_active` (`last_active`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=34003;

Habituellement, la requête prend environ 0,2 ms, mais toutes les 5 minutes (avec précision toutes les 5 minutes, 10:00:12, 10:05:12, 10:10:12 ...) Il prend plus de 250 ms, avec tout le temps passé avec le statut "Demande fin".

Toute idée de ce qui peut causer cela? Pourquoi une requête serait-elle ralentissée toutes les 5 minutes? Que se passe-t-il toutes les 5 minutes qui touchent "la fin de la requête"? Aucun autre processus ne fonctionne.

MySQL version 5.5.44

5
Alex

Toutes les utilisations de cette table s'exécuteront plus vite (certaines vont courir beaucoup plus vite) si vous vous jettison id et faire name le PRIMARY KEY.

Votre UPDATE est actuellement à la recherche de 2 btrees, plus la mise à jour de 2 Btrees. Le changement PK changerait ceux-ci et 2. Plus important encore, il serait simplement le verrouillage de la ligne.

Quelle est la taille de la table? Combien RAM avez-vous? Quelle est la valeur d'innodb_buffer_pool_size? Innodb_io_read_threads? Qu'est-ce que diable, voyons SHOW VARIABLES LIKE 'innodb%';

1
Rick James