mise à jour simple requête qui prend beaucoup de temps à s'exécuter dans MySQL
J'ai été vérifier la lenteur de la requête de log de MySQL, et a trouvé une entrée comme ci-dessous:
# Time: 131108 4:16:34
# Query_time: 14.726425 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 1
SET timestamp=1383884194;
UPDATE `Artist` SET ImageFilename = NULL, Title = 'Elton John', PopularityRating = 657, UniqueID = NULL, Description = NULL, IsFeatured = 0, FeaturedText = '', MetaDescription = '', MetaTitle = NULL, _Temporary_LastUpdOn = '2013-11-08 04:15:58 ', _Temporary_Flag = 0, _Deleted = 0, _DeletedOn = NULL, Priority = 0 WHERE ID = 3449748;
Comme vous pouvez le voir, il a fallu un nombre stupéfiant de 14.72 sec pour effectuer cette requête, lorsque c'est une simple mise à jour avec juste un WHERE
par clé primaire. J'ai essayé de ré-exécution de la requête, mais maintenant, il en cours d'exécution dans 0.095 sec qui est beaucoup plus raisonnable.
Des idées comment je peux debug pourquoi à un moment donné il a fallu si longtemps?
Edit 1: query_cache% variables
mysql> SHOW variables where variable_name like 'query_cache%';
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 210763776 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+-----------+
Edit 2: Artiste de la table info
CREATE TABLE `artist` (
`ID` bigint(20) NOT NULL,
`ImageFilename` mediumtext,
`Title` varchar(1000) DEFAULT NULL,
`PopularityRating` int(11) DEFAULT '0',
`UniqueID` mediumtext,
`Description` mediumtext,
`IsFeatured` tinyint(1) DEFAULT '0',
`FeaturedText` mediumtext,
`_Temporary_LastUpdOn` datetime DEFAULT '0001-01-01 00:00:00',
`_Temporary_Flag` tinyint(1) DEFAULT '0',
`_Deleted` tinyint(1) DEFAULT '0',
`_DeletedOn` datetime DEFAULT NULL,
`Priority` int(11) DEFAULT '0',
`MetaDescription` varchar(2000) DEFAULT NULL,
`MetaTitle` mediumtext,
PRIMARY KEY (`ID`),
KEY `_Temporary_Flag` (`_Temporary_Flag`),
KEY `_Deleted` (`_Deleted`),
KEY `Priority` (`Priority`),
KEY `PopularityRating` (`PopularityRating`),
KEY `Title` (`Title`(255)),
KEY `IsFeatured` (`IsFeatured`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Peut-être que la table a été verrouillée de l'époque.
Avez-vous des cache activé? Peut-être tiré par les cheveux, mais si une requête modifie les résultats mis en cache, puis une performance dip peut se produire.
Comment puis-je savoir si j'ai le cache activé?
exécuter ce SPECTACLE variables où variable_name comme " query_cache%';
Vous pouvez poster à la sortie de
Avez-vous des cache activé? Peut-être tiré par les cheveux, mais si une requête modifie les résultats mis en cache, puis une performance dip peut se produire.
Comment puis-je savoir si j'ai le cache activé?
exécuter ce SPECTACLE variables où variable_name comme " query_cache%';
Vous pouvez poster à la sortie de
SHOW CREATE TABLE Artist
, s'il vous plaît?
OriginalL'auteur Karl Cassar | 2013-11-08
Vous devez vous connecter pour publier un commentaire.
Compte tenu de la sortie que vous avez fournis, ma suggestion serait ici de minimiser la taille du cache. Son est bien sûr seulement ma meilleure hypothèse que cela a provoqué la mise à jour de temps à durer plus de 15 secondes parce que la requête elle-même est optimale à l'aide de
WHERE
surPRIMARY KEY
.Puisque vous n'avez pas été en mesure de reproduire le problème est difficile à déterminer.
Je lisais le cache de la documentation pour obtenir des informations.
Une autre partie de la docmentation
De toute façon, puisque vous avez la requête cache activé, je pense que c'est un bon point de départ.
Pour définir un nouveau cache de requête alors que dans la production
Mysql sera automatiquement réglée à la taille pour être aligné le plus proche de 1024 octets du bloc.
De lire cette documentation ainsi, il est très utile de comprendre. Cache de requête peut en même temps être à votre meilleur et votre pire réglage.
http://dev.mysql.com/doc/refman/5.1/en/query-cache.html
OriginalL'auteur Kay Nelson
Il y a un problème de votre table. Vous avez créé plusieurs index pour la table, qui comprend des champs qui vous permettra de mettre à jour dans le sql. Puis mysql a pour reconstruire l'index à chaque fois.
OriginalL'auteur user2963713
Je pense que vous n'avez pas à l'écoute du serveur MySQL variables, Il est important de régler les variables de serveur pour augmenter les performances. Il est recommandé d'avoir un coup d'oeil à la key_buffer_size et table_cache variables.
La key_buffer_size variable qui détermine la quantité de mémoire disponible pour le MySQL index de la mémoire tampon. Plus cette valeur est élevée, plus la quantité de mémoire disponible pour les index et les meilleures sont les performances.
La table_cache variable qui détermine la quantité de mémoire disponible pour la table de cache, et donc le nombre total de tables MySQL peut détenir à tout moment. Pour les serveurs chargés avec de nombreuses bases de données et des tables, cette valeur doit être augmentée pour que MySQL peut répondre à toutes les demandes de manière fiable.
OriginalL'auteur