为什么这个简单的MySQL更新查询需要这么长时间?

为什么这个简单的MySQL更新查询需要这么长时间?,mysql,indexing,sql-update,Mysql,Indexing,Sql Update,在过去的几个月里,我的主机一直向我发送消息,说我的网站使用MySQL的时间太多了。他们还会发送一些日志,显示哪些查询有时会占用最多的时间。有些查询有点长而且复杂,所以我理解为什么它们会成为一个问题。但有几个让我挠头。我接下来要重点关注的是: UPDATE parentmessages SET views=views+1 WHERE parentid='11308' 这个数字只是一个例子,它可以是任何parentid。parentmessages表以parentid作为主键,因此我认为它将被索引

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

UPDATE parentmessages SET views=views+1 WHERE parentid='11308'
这个数字只是一个例子,它可以是任何parentid。parentmessages表以parentid作为主键,因此我认为它将被索引并很容易找到。表中大约有11000条记录,实际上并不多。以下是我的主机给我的数据,显示昨天该查询在6个实例中持续了多长时间:

需要0.126455、1.472929、1.638743、3.040538、7.130041、112.498037秒才能完成 我想112可能是一个随机故障,但为什么有时需要3、7秒?!我最好的选择是因为我有很多索引,但我对MySQL的了解还不够,不知道这是否重要。为什么有时候是十分之一秒,有时候是很多秒

以下是“显示创建表”:

    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

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

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

Hmm,如果是这样的话,那么我真的不知道哪些违规者仅仅基于日志?没错。那么“坏查询列表”中的其他查询呢?访问parentmessages也是这样吗?到目前为止,我只处理了另外两个大的、杂乱无章的查询,这些查询并不特别重要,我没有时间简化,所以我现在就把它们取下来。然而,这一个,是必不可少的网站,不应该被删除,我也不知道如何简化考虑到它已经是多么简单!