【问题标题】:Why would this simple MySQL update query take so long?为什么这个简单的 MySQL 更新查询要花这么长时间?
【发布时间】:2014-10-24 01:34:57
【问题描述】:

在过去的几个月里,我的主机一直在向我发送消息,说我的网站使用了太多的 MySQL 分钟数。他们还会发送一些日志,显示哪些查询有时会占用最多的时间。有些查询有点长而且复杂,所以我理解为什么它们会成为一个问题。但有一些让我摸不着头脑。接下来我要重点介绍的是这个:

UPDATE parentmessages SET views=views+1 WHERE parentid='11308'

这个数字只是一个例子,它可以是任何 parentid。 parentmessages 表有 parentid 作为主键,所以我认为它会被索引并且很容易找到。表中大约有 11,000 条记录,实际上并没有那么多。以下是我的主机给我的关于这个查询昨天超过 6 个实例的时间:

耗时 0.126455 , 1.472929 , 1.638743 , 3.040538 , 7.130041 , 112.498037 秒完成

我想 112 可能是一个随机故障,但为什么有时需要 3、7 秒?!我最好的选择是因为我有很多索引,但我对 MySQL 的了解还不够,不知道这是否重要。为什么有时是 1/10 秒,有时是几秒?

这里是显示创建表:

    CREATE TABLE `parentmessages` (
 `parentid` int(7) NOT NULL AUTO_INCREMENT,
 `active` tinyint(1) NOT NULL,
 `level` int(2) NOT NULL,
 `type` varchar(10) NOT NULL,
 `hidden` tinyint(1) DEFAULT NULL,
 `sticky` tinyint(1) NOT NULL,
 `poll` tinyint(1) NOT NULL,
 `topic` varchar(120) DEFAULT NULL,
 `message` varchar(30000) NOT NULL,
 `views` int(6) NOT NULL,
 `replies` int(5) NOT NULL,
 `userid` int(7) NOT NULL,
 `datetimecalc` int(11) NOT NULL,
 `lastreplycalc` int(11) NOT NULL,
 `lastreplyuser` int(7) NOT NULL,
 `editedcalc` int(11) DEFAULT NULL,
 `editeduser` int(7) DEFAULT NULL,
 `realediteduser` int(7) DEFAULT NULL,
 `altint` int(7) DEFAULT NULL,
 `imageurl` varchar(125) DEFAULT NULL,
 `locked` tinyint(1) NOT NULL,
 `tempid` int(12) NOT NULL,
 PRIMARY KEY (`parentid`),
 KEY `useridindex` (`userid`),
 KEY `datetimecalcindex` (`datetimecalc`),
 KEY `activeindex` (`active`),
 KEY `lastreplycalcindex` (`lastreplycalc`),
 KEY `levelindex` (`level`),
 KEY `stickyindex` (`sticky`)
) ENGINE=MyISAM AUTO_INCREMENT=11716 DEFAULT CHARSET=latin1

【问题讨论】:

    标签: mysql indexing sql-update


    【解决方案1】:

    一个原因可能是,另一个慢查询阻塞了表,而您的更新只是在等待另一个查询完成。

    【讨论】:

    • 嗯,如果是这种情况,那么我真的无法确定哪些违规者仅基于日志?
    • 没错。你的“坏查询列表”中的其他查询呢?访问的 parentmessages 也一样吗?
    • 到目前为止,我只解决了另外两个问题,这些大而杂乱的查询并不是特别重要,而且我没有时间精简,所以我暂时将它们删除。然而,这个对网站来说是必不可少的,不应该被删除,考虑到它已经很简单,我也不知道如何简化它!
    【解决方案2】:

    不要使用 MyISAM。我忘了是谁说的,也许是 PeterZ,但“使用 myisam 意味着你不关心你的数据”。检查表锁定的最简单方法是查看进程列表。转储、插入、更新等都会锁定表。 MyISAM 在 5.6 中几乎被弃用是有充分理由的。

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多