简单的更新查询需要很长时间才能在MySQL中执行

Kar*_*sar 9 mysql performance

我正在检查MySQL的慢查询日志,并找到了如下条目:

# 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;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,执行此查询需要花费14.72秒的惊人时间,因为它只是一个WHERE主键的简单更新.我已经尝试重新执行查询,但现在它在0.095秒内执行,这更合理.

任何想法我如何调试为什么在那个特定的时间花了这么长时间?

编辑1:query_cache%变量

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       |
+------------------------------+-----------+
Run Code Online (Sandbox Code Playgroud)

编辑2:艺术家表信息

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
Run Code Online (Sandbox Code Playgroud)

Kay*_*son 1

鉴于您提供的输出,我的建议是最小化缓存大小。这当然只是我最好的假设,这导致更新时间超过 15 秒,因为查询本身使用WHEREon是最佳的PRIMARY KEY

由于您无法重现该问题,因此很难确定。

我再次阅读缓存文档以获取一些信息。

当表被修改时,查询缓存中的任何相关条目都会被刷新。这可能是您进行更新必须刷新缓存数据的原因。

文档的另一部分

请谨慎设置查询缓存过大的大小,这会增加维护缓存所需的开销,可能超出启用缓存的好处。数十兆字节的大小通常是有益的。数百兆字节的大小可能不是。

无论哪种方式,由于您启用了查询缓存,我认为这是一个很好的起点。

在生产过程中设置新的查询缓存

SET GLOBAL query_cache_size = 1000000;
Run Code Online (Sandbox Code Playgroud)

Mysql 会自动将大小设置为与最近的 1024 字节块对齐。

好好阅读这个文档,对理解很有帮助。查询缓存可以同时是您的最佳设置和最差的设置。

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html