基本上我正在监控网站上最慢的查询。事实证明它们是这样的:
INSERT INTO beststat (bestid,period,rawView) VALUES ( 'idX' , 2012 , 1 )
ON DUPLICATE KEY UPDATE rawView = rawView+1
基本上它是一个记录表。如果该行已经存在,它会更新rawView
为+1
beststat
所以InnoDB
我有行级锁定和考虑我做了很多插入更新它应该比 MyISAM 更快。
无论如何,该查询不应该花这么长时间,也许还有其他问题。可能是什么?
当然我有Unique
Index
一个bestid, period
附加信息
该表( beststat)目前有约 100 万条记录,其大小为:68MB。我有4GB RAM 和innodb buffer pool size
= 104,857,600。mysql:5.1.49-3
CREATE TABLE `beststat` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`bestid` int(11) unsigned NOT NULL,
`period` mediumint(8) unsigned NOT NULL,
`view` mediumint(8) unsigned NOT NULL DEFAULT '0',
`rawView` mediumint(8) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `bestid` (`bestid`,`period`)
) ENGINE=InnoDB AUTO_INCREMENT=2020577 DEFAULT CHARSET=utf8
请注意,我可以做一些更快的事情,例如:
UPDATE beststat SET rawView = rawView + 1 WHERE bestid = idX AND period = 2012;
if (mysql_affected_rows()==0)
INSERT INTO beststat (bestid,period,rawView) VALUES ('idX',2012,1)
所以大多数时候我只会运行第一个查询UPDATE
。但我想了解为什么第一个更简洁的查询很慢。
我发现这篇有趣的文章...仍在阅读